\(T1:facsum\)
题目
Mr.Hu最近偶得一函数
\[f(n) = n^m \times \sum_{d|n}{\sigma_0(d)\mu(\frac{n}{d})\frac{n}{d}}\]
求\(F(n) = \sum_{i=1}^n{f(i)},(n\leq 10^7,m\leq 10)\)
做法
数论函数掠杀我qwq
可以看出右边那个\(\sum\)里面的三个部分都是积性函数,所以它们的乘积也是积性函数,通过计算/打表/瞎猜可知:
当\(p\)为质数时,有\(f(p) = 2-p\)
对于\(p^x\),有\(f(p^x) = -x*p + x + 1\)
线性筛一遍即可求解
Code
#include<bits/stdc++.h>
#define N 10000005
#define re register
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
int n,m;
int p[N],d[N],c[N],v[N],cnt;
bool isnotp[N];
template <class T>
void read(T &x)
{
char c;int sign=1;
while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;
}
ll calc(ll x,ll y) {return ((ll)x-x*y+mod+1)%mod;}
void init(int maxn)
{
c[1]=v[1]=1;
isnotp[1]=1;
for(re int i=2;i<=maxn;++i)
{
if(!isnotp[i]) p[++cnt]=i,c[i]=i,d[i]=1,v[i]=2-i;
for(re int j=1;j<=cnt&&(ll)p[j]*i<=maxn;++j)
{
isnotp[p[j]*i]=1;
if(i%p[j]==0)
{
c[p[j]*i]=(ll)c[i]*p[j]%mod;
d[p[j]*i]=d[i]+1;
v[p[j]*i]=v[i/c[i]]*calc(d[p[j]*i],p[j])%mod;
break;
}
c[p[j]*i]=p[j];
d[p[j]*i]=1;
v[p[j]*i]=(ll)v[i]*v[p[j]]%mod;
}
}
}
ll quickpow(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b>>=1;
}
return ret;
}
int main()
{
freopen("facsum.in","r",stdin);
freopen("facsum.out","w",stdout);
init(N-1);
read(n);read(m);
ll ans=0;
for(re int i=1;i<=n;++i)
{
ans=(ans+quickpow(i,m)*v[i])%mod;
}
cout<<(ans%mod+mod)%mod<<endl;
return 0;
}