莫比乌斯
[湖北省队互测2014]一个人的数论
$Ans=\sum_{i=1}^{n}i^d[gcd(n,i)==1]$
$Ans=\sum_{i=1}^{n}i^d\sum_{p|i.p|n}u(p)$
推不下去了,换一个想法
$F(n)=\sum_{i=1}^ni^d$
$G(n)=\sum_{i=1}^{n}i^d[gcd(i,n)==1]$
$F(n)=\sum_{i|n}i^dG(\frac{n}{i})$
原理就相当于,每个数字只被一个倍数筛去
$G(n)=\sum_{i|n}u(i)i^dF(\frac{n}{i})$
将$F$用多项式表示
$F(n)=\sum_{i=0}^{d+1}f(i)n^i$
$G(n)=\sum_{i|n}u(i)i^d\sum_{j=0}^{d+1}f(j)(\frac{n}{i})^j$
$G(n)=\sum_{j=0}^{d+1}f(j)n^j\sum_{i|n}u(i)i^{d-j}$
$G(n)=\sum_{j=0}^{d+1}f(j)n^j\Pi_{p}\sum_{t=0}^{num[p]}u(p^t)p^{t(d-j)}$
$G(n)=\sum_{j=0}^{d+1}f(j)n^j\Pi_{p}\sum_{t=0}^{1}u(p^t)p^{t(d-j)}$
$G(n)=\sum_{j=0}^{d+1}f(j)n^j\Pi_{p}(1-p^{d-j})$
#include<bits/stdc++.h> #define mod 1000000007 #define int long long using namespace std; int a[150][150],zy[150]; int d,n; int my_pow(int a,int b) { if(b==-1) { return my_pow(a,mod-2); } int res=1; while(b) { if(b&1) { res=(res*a)%mod; } a=(a*a)%mod; b>>=1; } return res; } void guass() { for(int i=1;i<=d+2;i++) { int maxn=i; for(int j=i+1;j<=d+2;j++) { if(abs(a[j][i])>abs(a[maxn][i])) maxn=j; } swap(a[maxn],a[i]); for(int j=1;j<=d+2;j++) { if(i==j) continue; int tmp=(a[j][i]*my_pow(a[i][i],mod-2))%mod; for(int k=1;k<=d+3;k++) { a[j][k]=(a[j][k]+mod-tmp*a[i][k]%mod)%mod; } } } for(int i=1;i<=d+2;i++) { zy[i-1]=(a[i][d+3]*my_pow(a[i][i],mod-2))%mod; } } void Init() { for(int i=1;i<=d+2;i++) { a[i][d+3]=a[i-1][d+3]+my_pow(i,d); } for(int i=1;i<=d+2;i++) { for(int j=1;j<=d+2;j++) { a[i][j]=my_pow(i,j-1); } } guass(); } int pri[100005],Ans,lj,N=1; signed main() { cin>>d>>n; Init(); for(int i=1;i<=n;i++) { cin>>pri[i]>>lj; N=N*my_pow(pri[i],lj)%mod; } for(int j=0;j<=d+1;j++) { int res=1; for(int i=1;i<=n;i++) { res=(res*(1+mod-my_pow(pri[i],d-j))%mod)%mod; } Ans=(Ans+zy[j]*my_pow(N,j)%mod*res%mod)%mod; } cout<<Ans<<endl; }
总结结论
大概类似的$F(n)=\sum_{i=1}^{n}i$
设$G(n)=\sum_{i=1}^{n}i[gcd(n,i)==1]$
都可以$F(n)=\sum_{i|n}iG(\frac{n}{i})$