第一个点T了,90分求助
查看原帖
第一个点T了,90分求助
366237
_Lilyan_楼主2022/5/12 23:52

我优化不了了,求助qwq

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#if(__cplusplus == 201103L)
#include <unordered_map>
#include <unordered_set>
#else
#include <tr1/unordered_map>
#include <tr1/unordered_set>
namespace std
{
    using std::tr1::unordered_map;
    using std::tr1::unordered_set;
}
#endif
const int N=1e5+10;
const int INF=0x3f3f3f3f;
using namespace std;
long long p,b,n; 
unordered_map<long long ,long long> mp;
inline void read(long long &num)
{
   	int s = 0, w = 1; char ch = getchar();
   	while(ch < '0' || ch > '9')
   	{
   	    if(ch == '-')
		{
		   	w = -1; 
			ch = getchar();
		}  
	}
    while(ch >= '0' && ch <= '9')
    {
   		s = s * 10 + ch - '0';
		ch = getchar();
	} 
   num = s*w;
}
inline long long qpow(register long long a,register long long n,register long long p)
{
	if(n==0)
	{
		return 1;
	}
	else if(n%2==1)
	{
		return qpow(a,n-1,p)*a%p;
	}
	else
	{
		long long temp=qpow(a,n/2,p)%p;
		return temp*temp%p;
	}
//	int ans=1;
//	while(n)
//	{
//		if(n&1)
//		{
//			ans*=a;
//		}
//		a*=a;
//		n>>=1;
//	}
//	return ans;
}
inline void bsgs(register long long a,register long long b,register long long p)//a^x≡b(mod p) 
{
	if(b==1)
	{
		cout<<0;
		return ;
	}
	register long long m=ceil(sqrt(p));
	register long long t=b;
	mp[b]=0;
	for(register long long j=1;j<m;j++)
	{
		t=t*a%p;
		mp[t]=j;
	}
	register long long qp=qpow(a,m,p);
	t=1;
	for(register long long i=1;i<=n;i++)
	{
		t=t*qp%p;
		if(mp.count(t)!=0)
		{
			cout<<i*m-mp[t];
			return ;
		}
	}
	cout<<"no solution";
} 
signed main()
{
	read(p),read(b),read(n);
	bsgs(b,n,p);
 	return 0;
}

2022/5/12 23:52
加载中...