求助 测试点1T了
查看原帖
求助 测试点1T了
183401
重力加速度楼主2021/9/6 21:31
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#define ll long long
using namespace std;
ll ksm(ll b,ll p, ll k){
	if(p==0)return 1%k;
	ll ans=1;
	while(p>0){
		if(p&1){
			ans*=b;
			ans%=k;
		}
		b*=b;
		b%=k;
		p>>=1;
	}
	return ans%k;
}
ll solve(ll a,ll b,ll p){
	ll s=sqrt(p);
	set<ll> se;
	ll ans=1;
	for(int i=0;i<s;i++){
		se.insert(ans);
		ans=1ll*ans*a%p;
	}
	ans=ksm(ans,p-2,p);
	ll c=b;
	for(int i=0;i<p-1;i+=s){
		if(se.count(c)!=0){
			ll v=ksm(a,i,p);
			while(v!=b){
				v=v*a%p;
				i++;
			}
			return i;
		}
		c=c*ans%p;
	}
	return -1;
}
signed main(void)
{
	ll b,n;
	ll p;
	scanf("%lld%lld%lld",&p,&b,&n);
	ll ans=solve(b,n,p);
	if(ans==-1)printf("no solution");
	else printf("%lld",ans);
	return 0;
}

提交记录

2021/9/6 21:31
加载中...