T最后一个点,求助
查看原帖
T最后一个点,求助
87651
www2003楼主2021/11/28 11:20
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<unordered_map>
#define reg register
#define pb push_back
#define qr read()
#define LL long long

using namespace std;
inline int read()
{
	int x=0,k=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*k;
}


int exgcd(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x = 1;
		y = 0;
		return a;
	}
	int G = exgcd(b,a%b,x,y);
	int Y = y;
	y = x - a / b * y;
	x = Y;
	return G;
}


int p;

inline int fp(int a,int b)
{
	int ans = 1;
	while(b)
	{
		if(b&1)ans = 1ll * ans * a % p;
		a = 1ll * a * a % p;
		b >>= 1;
	}
	return ans;
}

unordered_map<int,int>h;
int a,b;

int exbsgs()
{
	a %= p,b %= p;
	if(b == 1 || p == 1)return 0;
	int d,ax = 1,cnt = 0,x,y;
	while((d = exgcd(a,p,x,y)) ^ 1)
	{
		if(b % d)return -1;
		cnt++;
		ax = 1ll * ax * (a / d) % p;
		p /= d,b /= d;
		if(ax == b)return cnt;	
	} 
	
	exgcd(ax,p,x,y);
	int inv = (x % p + p) % p;
	b = 1ll * inv * b % p;
	
	h.clear();
	if(a % p == 0)return -1;
	int m = ceil(sqrt(p));
	int A = 1,B;
	for(int i = 0; i < m; i++)
	{
		h[1ll * b * A % p] = i;
		A = 1ll * A * a % p;
	}
	if(!A) return !b? 1+cnt:-1;
	A = fp(a,m),B = A;
	for(int i = 1; i <= m; i++)
	{
		if(h[A])
		{
			return i * m - h[A] + cnt;
		}
		A = 1ll * A * B % p;
	}
	return -1;
	 
}

int main()
{
	while(scanf("%d%d%d",&a,&p,&b) == 3 && a && b && p)
	{
		int ans = exbsgs();
		if(ans == -1)printf("No Solution\n");
		else printf("%d\n",ans);
	}
}
2021/11/28 11:20
加载中...