\(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; }