【模板】BSGS

模板題

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
#define hmod 1389001
LL A,B,mod;
inline LL Pow(LL a,LL b)
{
	LL ret=1;
	while(b)
	{
		if(b&1)
			ret=ret*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ret;
}
int head[hmod],a[hmod][2],nt[hmod],cnt;
inline LL Find(LL x)
{
	LL x1=x%hmod;
	for(int i=head[x1];i!=-1;i=nt[i])
		if(a[i][0]==x)
			return i;
	return -1;
}
inline void insert(LL x,LL v1)
{
	LL x1=x%hmod;
	a[++cnt][0]=x;
	a[cnt][1]=v1;
	nt[cnt]=head[x1];
	head[x1]=cnt;
}
int main()
{
	while(~scanf("%lld%lld%lld",&mod,&A,&B))
	{
		if(B==1)
		{
			printf("0\n");
			continue;
		}
		memset(head,-1,sizeof(head));
		cnt=0;
		LL m=(LL)ceil(sqrt(mod));
		for(LL i=0,x=B;i<m;i++)
		{
			LL x1=Find(x);
			if(x1==-1)
				insert(x,i);
			else
				a[x1][1]=i;
			x=x*A%mod;
		}
		LL b1=Pow(A,m);
		bool f1=0;
		for(LL i=1,x=1;i<=m;i++)
		{
			x=x*b1%mod;
			int x1=Find(x);
			if(x1!=-1)
			{
				f1=1;
				printf("%lld\n",i*m-a[x1][1]);
				break;
			}
		}
		if(!f1)
			printf("no solution\n");
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章