求助莫反
查看原帖
求助莫反
538427
czy0323楼主2023/5/20 08:43

样例全过了,但是交上去全WA

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5,mod=1e9+7;
int mul[N],f[N],sumul[N],sumf[N];
int prime[N],len;
bool isprime[N];

inline int ope(int A,int B){
	int l=1,r=min(A,B),ans=0;
	while( l<=r ){
		int l1=A/(A/l), l2=B/(B/l);
		l1=min(l1,l2);
		ans+=(A/l)*(B/l)*(sumul[l1]-sumul[l-1]);
		l=l1+1;
	}
	return ans;
}

inline int fast_pow(int base,int p){
	int ans=1;
	while( p ){
		if( p&1 )
			ans=ans*base%mod;
		base=base*base%mod;
		p>>=1;
	}
	return ans;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	mul[1]=1;
	for(int i=2;i<N;i++){
		if( !isprime[i] ){
			prime[++len]=i;
			mul[i]=-1;
		}
		for(int j=1;j<=len && prime[j]*i<N;j++){
			isprime[i*prime[j]]=1;
			if( i%prime[j]==0 ){
				mul[i*prime[j]]=0;
				break;
			}
			mul[i*prime[j]]=-mul[i];
		}
	}
	f[1]=f[2]=1;
	for(int i=3;i<N;i++)
		f[i]=(f[i-1]+f[i-2])%mod;
	sumf[0]=1;
	for(int i=1;i<N;i++){
		sumul[i]=sumul[i-1]+mul[i];
		sumf[i]=(sumf[i-1]*f[i])%mod;
	}
	int T;
	cin>>T;
	while( T-- ){
		int n,m;
		cin>>n>>m;
		if( n>m )
			swap(n,m);
		int l=1,r=n,ans=1;
		while( l<=r ){
			int l1=n/(n/l);
			ans=ans*fast_pow(sumf[l1]*fast_pow(sumf[l-1],mod-2)%mod,ope(n/l,m/l))%mod;
			l=l1+1;
		}
		cout<<ans<<"\n";
	}
	return 0;
}
2023/5/20 08:43
加载中...