我的求原根咋厌氧了啊
查看原帖
我的求原根咋厌氧了啊
508032
int08楼主2024/3/9 14:43

开了 O2 后最后一个点 RE,不开全 AC。

本机开了 O2 也正常通过。

最后一个点是

input:
3
2 1
4 1
8 1

output:
1
1
1
3
0

#include<bits/stdc++.h>
using namespace std;
#define int long long
bool ip[1145141];vector<int> prime;
int p;
void getpm(int n)
{
	for(int i=1;i<=n;i++) ip[i]=1;
	for(int i=2;i<=sqrt(n);i++)
	if(ip[i])
	for(int j=2*i;j<=n;j+=i) ip[j]=0;
	for(int i=2;i<=n;i++) if(ip[i]) prime.push_back(i);
}
int phi(int x)
{
	int ans=x;
	for(auto p:prime)
	{
		if(p*p>x) break;
		if(x%p==0)
		{
			ans/=p,ans*=p-1;
			while(x%p==0) x/=p;
		}
	}
	if(x>1) ans=ans/x*(x-1);
	return ans;
}
int qp(int x,int y)
{
	int ans=1;
	for(int i=1,j=x;i<=y;i*=2,j=(j*j)%p) if(i&y) ans=(ans*j)%p;
	return ans;
}
bool chk(int x)
{
	if(abs(x-3)==1) return 1;
	for(auto p:prime)
	{
		if(x%p==0&&p!=2)
		{
			while(x%p==0&&p!=2) x/=p;
			if(x<=2) return 1;
			return 0;
		}
	}
}
int T,i,j,n,d,pn;
vector<int> pny,yg;
int myg;
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	cout.tie(0);
	getpm(1000004);
	cin>>T;
	while(T--)
	{
		cin>>n>>d;p=n;
		if(!chk(n))
		{
			cout<<"0\n\n";continue;
		}
		int pn=phi(n),ppn=phi(pn);
		cout<<ppn<<endl;
		for(i=1;i<=sqrt(pn);i++)
		if(pn%i==0&&i!=pn)
		{
			pny.push_back(i);
			if(i*i!=pn&&i!=1) pny.push_back(pn/i);
		}
		for(i=1;;i++)
		if(__gcd(i,n)==1)
		{
			bool pd=1;
			for(auto j:pny)
			{
				if(qp(i,j)==1)
				{
					pd=0;break;
				}
			}
			if(pd)
			{
				myg=i;
				break;
			}
		}
		for(i=1;i<=pn;i++)
		if(__gcd(pn,i)==1) yg.push_back(qp(myg,i));
		sort(yg.begin(),yg.end());
		for(i=1;i<=ppn;i++) if(i%d==0) cout<<yg[i-1]<<" ";
		cout<<endl;
		pny.clear(),yg.clear();
	}
}
2024/3/9 14:43
加载中...