求助奇奇怪怪的错误
查看原帖
求助奇奇怪怪的错误
472963
PMZG楼主2021/5/10 17:03

b数组开小就会re。。 在本地oj上提交发现厌氧……

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int mod=999911659;
vector <int>a;
int jcqm[40005][5],ny[40005][5],jcny[40005][5];
int b[5];
int ys[5]={0,2,3,4679,35617};
int x,y;
void gan()
{
	for(int j=1;j<=4;j++)
	{
	int m=ys[j];
	ny[1][j]=1;
	for(int i=2;i<=m-1;i++)
    ny[i][j]=(m-m/i)*ny[m%i][j]%m;
	jcqm[0][j]=1;jcny[0][j]=1;
	for(int i=1;i<=ys[j];i++)
	{
		jcqm[i][j]=jcqm[i-1][j]*i%m;
		jcny[i][j]=jcny[i-1][j]*ny[i][j]%m;
	}
	}
} 
inline int ksm(int a,int b,int c)
{
	int ans=1;
	a%=c;
	while(b)
	{
		if(b%2)ans=(ans*a)%c;
		b/=2;
		a=(a*a)%c;
	 } 
	return ans;
}
inline int cnm(int n,int m,int q)
{
	return jcqm[n][q]*(jcny[m][q]*jcny[n-m][q]%ys[q])%ys[q];
}
inline int lks(int n,int m,int q)
{
	if(n<m)return 0;
	if(m==0)return 1;
	return cnm(n%ys[q],m%ys[q],q)*lks(n/ys[q],m/ys[q],q)%ys[q];
}
inline int exgcd(int a,int b)
{
	if(b==0)
	{
		x=1;y=0;
		return a;
	}
	int gcd=exgcd(b,a%b);
	int q=x;
	x=y;
	y=q-(a/b)*x;
	return gcd;
}
inline int crt()
{
	int ans=0;
	for(int i=1;i<=4;i++)
	{
		x=0;y=0;
		int gcd=exgcd((mod-1)/ys[i],ys[i]);
		x%=ys[i];if(x<ys[i])x+=ys[i];
		ans=(ans+x*b[i]*((mod-1)/ys[i])%(mod-1))%(mod-1);
	}
	ans%=(mod-1);
	return ans;
}
signed main()
{
	int n,g;
	cin>>n>>g;
	if(g%mod==0)
	{
		cout<<0;return 0;
	}
	gan(); 
	for(int i=1;i<=sqrt(n);i++)
	if(n%i==0)
	{
		a.push_back(i);
		if(n/i!=i)a.push_back(n/i);
	}
	for(int i=1;i<=4;i++)
	{
		int an=0;
		for(int j=0;j<a.size();j++)
	   	an=(an+lks(n,a[j],i))%ys[i];
		b[i]=an; 
	}
	cout<<ksm(g,crt(),mod);
	return 0;
}
2021/5/10 17:03
加载中...