yyb大佬太强啦……
感觉还是有一点地方没有搞懂orz
1 //minamoto 2 #include<cstdio> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 inline int read(){ 9 #define num ch-‘0‘ 10 char ch;bool flag=0;int res; 11 while(!isdigit(ch=getc())) 12 (ch==‘-‘)&&(flag=true); 13 for(res=num;isdigit(ch=getc());res=res*10+num); 14 (flag)&&(res=-res); 15 #undef num 16 return res; 17 } 18 const int N=1e6+5,mod=1e9+7; 19 int ksm(int x,int y){ 20 int res=1; 21 while(y){ 22 if(y&1) res=1ll*res*x%mod; 23 x=1ll*x*x%mod,y>>=1; 24 } 25 return res; 26 } 27 int f[N],p[N],cnt,g[N],inv[N],F[N],mu[N],vis[N]; 28 int n,m; 29 void init(){ 30 f[1]=g[1]=F[0]=F[1]=mu[1]=1; 31 for(int i=2;i<N;++i){ 32 f[i]=(f[i-1]+f[i-2])%mod; 33 g[i]=ksm(f[i],mod-2),F[i]=1; 34 if(!vis[i]) p[++cnt]=i,mu[i]=-1; 35 for(int j=1;j<=cnt&&i*p[j]<N;++j){ 36 vis[i*p[j]]=1; 37 if(i%p[j]==0) break; 38 mu[i*p[j]]=-mu[i]; 39 } 40 } 41 for(int i=1;i<N;++i){ 42 if(!mu[i]) continue; 43 for(int j=i;j<N;j+=i) 44 F[j]=1ll*F[j]*(mu[i]==1?f[j/i]:g[j/i])%mod; 45 } 46 for(int i=2;i<N;++i) 47 F[i]=1ll*F[i]*F[i-1]%mod; 48 } 49 int main(){ 50 // freopen("testdata.in","r",stdin); 51 init();int T=read(); 52 while(T--){ 53 n=read(),m=read(); 54 if(n>m) swap(n,m); 55 int ans=1,inv=0; 56 for(int l=1,r;l<=n;l=r+1){ 57 r=min(n/(n/l),m/(m/l)); 58 inv=1ll*F[r]*ksm(F[l-1],mod-2)%mod; 59 ans=1ll*ans*ksm(inv,1ll*(n/l)*(m/l)%(mod-1))%mod; 60 } 61 printf("%d\n",(ans+mod)%mod); 62 } 63 return 0; 64 }
洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)
原文:https://www.cnblogs.com/bztMinamoto/p/9703857.html