求助莫反
查看原帖
求助莫反
230804
Durancer楼主2021/3/28 21:17

做了一晚上了,改不出来了/qwq,求改

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<stack>
#include<map>
#include<cmath>
#define int long long 
using namespace std;
const int N=1e6+9;
const int M=1e6;
const int mod=1e9+7;
int mu[N];
int sum[N];
int g[N];//做fib的逆元 
int fib[N];
int prime[N],cnt;
int Te[N];//总的预处理 
int T,n,m;
bool vis[N];
int read()
{
	int f=1,x=0;
	char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();	}	
	while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^'0');s=getchar();}
	return f*x;
} 
int quick(int x,int p)
{
	int ret=1;
	while(p)
	{
		if(p&1) ret=x*ret%mod;
		x=x*x%mod;
		p>>=1;
	}
	return ret%mod;
}
void get_mu()
{
	fib[1]=1;
	fib[0]=0;
	mu[1]=1;
	Te[1]=Te[0]=1;
	g[1]=1; 
	for(int i=2;i<=M;i++) 
	{
		Te[i]=1;//防止乘的时候死了
		if(!vis[i])
		{
			prime[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt&&prime[j]<=M/i;j++)
		{
			vis[i*prime[j]]=true;
			if(i%prime[j]==0) 
				break;
			else 
				mu[i*prime[j]]=-mu[i];
		}
	}
} 
void prepare()
{
	for(int i=2;i<=M;i++) fib[i]=(fib[i-1]%mod+fib[i-2]%mod)%mod;
	for(int i=2;i<=M;i++) g[i]=quick(fib[i],mod-2);
	for(int i=2;i<=M;i++)
	{
		if(mu[i]==0) continue;//既然mu[i]是0,那么mu[ki]一定是0,不需要管
		for(int j=i;j<=M;j+=i)//d|n 的性质进行查找
		{
			if(mu[i]==1)//原数 
				Te[j]=Te[j]*1ll*fib[j/i]%mod; 
			if(mu[i]==-1)//逆元
				Te[j]=Te[j]*1ll*g[j/i]%mod; 
		}
	}
	for(int i=1;i<=M;i++)
		Te[i]=Te[i]*Te[i-1]%mod;
	return;
}
signed main()
{
	
	T=read();
	get_mu();
	prepare();
	while(T--)
	{
		int ans=1;
		n=read();
		m=read();
		if(n>m) swap(n,m);
		for(int l=1,r=1;l<=n;l=r+1)
		{
			r=min((n/(n/l)),(m/(m/l)));
			int in=(Te[r]*quick(Te[l-1],mod-2)%mod);
			
			ans=ans*1ll*quick(in,(n/l)*(m/l)%(mod-1))%mod;
		}
		printf("%lld\n",(ans+mod)%mod);
	}
	return 0;
}
2021/3/28 21:17
加载中...