95WA求助
查看原帖
95WA求助
104381
hanmo0321楼主2020/11/4 21:37
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=999911659;
const ll mod1=2;
const ll mod2=3;
const ll mod3=4679;
const ll mod4=35617;
ll n,g,ans,jc1[5],jc2[5],jc3[4700],jc4[35700],X,Y;
int s;
ll gcd(ll a,ll b){
	return !b?a:gcd(b,a%b);
}
ll lcm(ll a,ll b){
	return a/gcd(a,b)*b;
}
void exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1;
		y=0;
	}else{
		exgcd(b,a%b,x,y);
		x-=a/b*y;
		swap(x,y);
	}
}
ll q_pow(ll a,ll b,ll mod){
	ll ans=1;
	while(b>0){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
ll C(ll n,ll m,ll mod){
	if(!m) return 1;
	if(n<m) return 0;
	if(n==m) return 1;
	if(mod==mod1) return jc1[n]*q_pow(jc1[m],mod1-2,mod1)%mod1*q_pow(jc1[n-m],mod1-2,mod1)%mod1;
	if(mod==mod2) return jc2[n]*q_pow(jc2[m],mod2-2,mod2)%mod2*q_pow(jc2[n-m],mod2-2,mod2)%mod2;
	if(mod==mod3) return jc3[n]*q_pow(jc3[m],mod3-2,mod3)%mod3*q_pow(jc3[n-m],mod3-2,mod3)%mod3;
	if(mod==mod4) return jc4[n]*q_pow(jc4[m],mod4-2,mod4)%mod4*q_pow(jc4[n-m],mod4-2,mod4)%mod4;
}
ll Lucas(ll n,ll m,ll mod){
	if(!m) return 1;
	if(n<m) return 0;
	if(n==m) return 1;
	return Lucas(n/mod,m/mod,mod)*C(n%mod,m%mod,mod)%mod;
}
ll solve(ll x){
//	printf("x=%lld\n",x);
	ll a1=Lucas(n,x,mod1),a2=Lucas(n,x,mod2),a3=Lucas(n,x,mod3),a4=Lucas(n,x,mod4);
	ll M=mod1*mod2*mod3*mod4,L=lcm(lcm(lcm(mod1,mod2),mod3),mod4);
	ll M1=M/mod1,M2=M/mod2,M3=M/mod3,M4=M/mod4;
	ll ans=0;
	exgcd(M1,mod1,X,Y);
//	printf("X1=%lld\n",X);
	X=(X%mod1+mod1)%mod1;
	ans=(ans+X*M1%L*a1%L)%L;
	exgcd(M2,mod2,X,Y);
//	printf("X2=%lld\n",X);
	X=(X%mod2+mod2)%mod2;
	ans=(ans+X*M2%L*a2%L)%L;
	exgcd(M3,mod3,X,Y);
//	printf("X3=%lld\n",X);
	X=(X%mod3+mod3)%mod3;
	ans=(ans+X*M3%L*a3%L)%L;
	exgcd(M4,mod4,X,Y);
//	printf("X4=%lld\n",X);
	X=(X%mod4+mod4)%mod4;
	ans=(ans+X*M4%L*a4%L)%L;
//	printf("ans=%lld\n",ans);
//	printf("a1=%lld\n",a1);
//	printf("a2=%lld\n",a2);
//	printf("a3=%lld\n",a3);
//	printf("a4=%lld\n",a4);
//	printf("M1=%lld\n",M1);
//	printf("M2=%lld\n",M2);
//	printf("M3=%lld\n",M3);
//	printf("M4=%lld\n",M4);
//	printf("M=%lld\n",M);
//	printf("L=%lld\n",L);
	return ans;
}
int main(){
	jc1[0]=1;
	for(int i=1;i<=mod1;i++) jc1[i]=jc1[i-1]*i%mod1;
	jc2[0]=1;
	for(int i=1;i<=mod2;i++) jc2[i]=jc2[i-1]*i%mod2;
	jc3[0]=1;
	for(int i=1;i<=mod3;i++) jc3[i]=jc3[i-1]*i%mod3;
	jc4[0]=1;
	for(int i=1;i<=mod4;i++) jc4[i]=jc4[i-1]*i%mod4;
	scanf("%lld%lld",&n,&g);
	if(g==0){
		printf("0\n");
		return 0;
	}
	s=sqrt(n);
	for(int i=1;i<=s;i++)
		if(n%i==0){
			ans+=solve(i);
			if(i*i!=n) ans=(ans+solve(n/i))%(mod-1);
		}
	printf("%lld\n",q_pow(g,ans,mod));
	return 0;
}
2020/11/4 21:37
加载中...