推到了一个推不下去的形式,然后就不会了 ~
看题解后傻了:我推的是对的,推不下去是因为不需要再推了.
复杂度看似很大,但其实是均摊 $O(n)$ 的,看来分析复杂度也是一个能力啊 ~
code:
#include <bits/stdc++.h> #define ll long long #define N 500006 #define mod 1000000007 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int cnt; int mu[N],vis[N],prime[N]; int qpow(int x,int y) { int tmp=1; while(y) { if(y&1) tmp=(ll)tmp*x%mod; x=(ll)x*x%mod; y>>=1; } return tmp; } void Initialize() { int i,j; mu[1]=1; for(i=2;i<N;++i) { if(!vis[i]) prime[++cnt]=i,mu[i]=-1; for(j=1;j<=cnt&&prime[j]*i<N;++j) { vis[i*prime[j]]=1; if(i%prime[j]) { mu[i*prime[j]]=-mu[i]; } else { mu[i*prime[j]]=0; break; } } } } int n,m; int a[N],sum[N]; int ans=0; int main() { int i,j; // setIO("input"); Initialize(); scanf("%d%d",&n,&m); if(n>m) swap(n,m); for(i=1;i<=m;++i) a[i]=1; for(int d=1;d<=n;++d) { for(i=1;i<=m/d;++i) { a[i]=(ll)a[i]*i%mod; sum[i]=(ll)(sum[i-1]+a[i])%mod; } int tmp=0; for(int c=1;c<=n/d;++c) { tmp=(ll)(tmp+(ll)mu[c]*qpow(c,2*d)%mod*sum[n/d/c]%mod*sum[m/d/c]%mod+mod)%mod; } ans=(ll)(ans+(ll)qpow(d,d)*tmp%mod)%mod; } printf("%d ",ans); return 0; }