[bzoj3561]DZY Loves Math VI
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 1000000007 4 #define N 500005 5 #define ll long long 6 ll n,m,t,ans,mu[N],vis[N],p[N],c[N],sum[N]; 7 void xxs(int n){ 8 mu[1]=1; 9 for(int i=2;i<=n;i++){ 10 if (!vis[i])mu[p[++p[0]]=i]=-1; 11 for(int j=1;(j<=p[0])&&(i*p[j]<=n);j++){ 12 vis[i*p[j]]=1; 13 if (i%p[j]==0)break; 14 mu[i*p[j]]=-mu[i]; 15 } 16 } 17 } 18 ll ksm(ll n,ll m){ 19 if (!m)return 1LL; 20 ll s=ksm(n,m>>1); 21 s=s*s%mod; 22 if (m&1)s=s*n%mod; 23 return s; 24 } 25 int main(){ 26 xxs(N-5); 27 scanf("%lld%lld", &n,&m); 28 if (n<m)swap(n,m); 29 for(int i=1;i<=n;i++)c[i]=1; 30 for(int i=1;i<=m;i++){ 31 for(int j=1;i*j<=n;j++){ 32 c[j]=c[j]*j%mod; 33 sum[j]=(sum[j-1]+c[j])%mod; 34 } 35 t=ksm(i,i); 36 for(int j=1;i*j<=m;j++)ans=(ans+t*mu[j]%mod*c[j]%mod*c[j]%mod*sum[n/(i*j)]%mod*sum[m/(i*j)])%mod; 37 } 38 printf("%lld",ans); 39 }