记录编号 77546 评测结果 AAAAAAAAAA
题目名称 drei 最终得分 100
用户昵称 Gravatardigital-T 是否通过 通过
代码语言 C++ 运行时间 0.051 s
提交时间 2013-11-02 08:51:37 内存使用 0.35 MiB
显示代码纯文本
#include<fstream>
#include<cmath>
#include<algorithm>
using namespace std;
ifstream fi("drei.in");
ofstream fo("drei.out");
long long A,P;
bool prime[40001];
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
int euler_phi(int n)
{
  int m=(int)sqrt(n+0.5);
  int ans=n;
  for(int i=2;i<=m;i++) 
    if(n%i==0)
     {
       ans=ans/i*(i-1);
       while(n%i==0) n/=i;
     }
  if(n>1) ans=ans/n*(n-1);
  return ans;
}
long long quickpow(int x)
{
	if(x==1)return A%P;
	long long temp=quickpow(x/2);
	temp=(temp*temp)%P;
	if(x%2==1)temp=(temp*A)%P;
	return temp%P;
}
void work()
{
	fi>>A>>P;
	if(gcd(A,P)!=1||P==1)
	{
		fo<<"-1"<<endl;
		return;
	}
	long long lim=euler_phi(P);
	long long ans=lim;
	for(long long i=2;i<=(long long)sqrt((double)lim+0.5);i++)
	if(ans%i==0)
	{
		long long ta=i,tb=ans/i;
		while(tb%i==0)tb/=i,ta*=i;
		if(quickpow(ta)==1)
		{
			while(quickpow(ta/i)==1)ta/=i;
			ans=min(ta,ans);
		}
		tb=ans;
		while(tb%i==0&&quickpow(tb/i)==1)tb/=i;
		ans=min(tb,ans);
	}
	fo<<ans<<endl;
}
int main()
{
	int T;
	fi>>T;
	while(T--)work();
	return 0;
}