萌新求助数论全家桶,90分WA
查看原帖
萌新求助数论全家桶,90分WA
92682
Eric_cai楼主2021/11/6 14:57
#include<iostream>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int mod=999911659;
int fact[100005];
int n,g,p,a[105]={0,2,3,4679,35617},b[105];
int fast_pow(int x,int y,int m)
{
	int ret=1;
	while(y)
	{
		if(y&1) ret=ret*x%m;
		x=x*x%m;
		y>>=1;
	}
	return ret;
}
int C(int x,int y,int m)
{
	if(x>y) return 0;
	return fact[y]*fast_pow(fact[x]*fact[y-x]%m,m-2,m)%m;
}
int Lucas(int x,int y,int m)
{
	if(x==0) return 1;
	return ((Lucas(x/m,y/m,m)%m)*(C(x%m,y%m,m)%m))%m;
}
int CRT(int x,int m)
{
	int ret=0;
	for(int i=1;i<=x;i++)
	{
		int y=m/a[i];
		ret+=(((y*fast_pow(y,a[i]-2,m)%m)*b[i])%m);
	}
	return ret;
}
void get_fact(int x)
{
	fact[0]=1;
	for(int i=1;i<=x;i++) fact[i]=(fact[i-1]*i)%x;
}
int get_ans(int x,int y)
{
	for(int i=1;i<=4;i++)
	{
		get_fact(a[i]);
	    b[i]=Lucas(x,y,a[i]);
	}
	return CRT(4,mod-1);
}
signed main()
{
	scanf("%lld%lld",&n,&g);
	for(int i=1;i<=ceil(sqrt(n));i++)
	{
		if(n%i==0)
		{
			p+=get_ans(i,n);
			if(i<n/i) p+=get_ans(n/i,n);
			p%=(mod-1);
		}
	}
	printf("%lld\n",fast_pow(g,p,mod));
	return 0;
}
2021/11/6 14:57
加载中...