调了一下午,不知道哪里错了,求找错
查看原帖
调了一下午,不知道哪里错了,求找错
178992
Hanghang楼主2021/5/16 17:32
#include<bits/stdc++.h>
using namespace std;

const int N=1000003;
bool v[N];
int p[N],ph[N];
vector <int> q;
vector <int> ans;
int XXS()
{
	int cnt=0;ph[1]=1;
	for(int i=2;i<N;i++)
	{
		if(!v[i])p[++cnt]=i,ph[i]=i-1;
		for(int j=1;j<=cnt&&i*p[j]<N;j++)
		{
			v[i*p[j]]=1;
			if(i%p[j]==0)
			{
				ph[i*p[j]]=ph[i]*p[j];break;
			}
			else
			{
				ph[i*p[j]]=ph[i]*(p[j]-1);
			}
		}
	}
}
void D(int x)
{
	for(int i=2;i*i<=x;i++)
		if(x%i==0)
		{
			q.push_back(i);
			while(x%i==0)x/=i;
		}
	if(x>1)q.push_back(x);
}
int YG(int x)
{
	if(x==2||x==4)return 1;
	if(x%2==0)x/=2;
	for(int i=2;p[i]<=x;i++)
	    if(x%p[i]==0)
	    {
	    	while(x%p[i]==0)
	    	{
	    		x/=p[i];
			}
	    	return x==1;
		}
	return 0;
}
int K(long long a,long long b,long long Mod)
{
	long long s=1;
	for(;b;b>>=1,a=a*a%Mod)
	    if(b&1)s=(s*a)%Mod;
	return s; 
}
int main()
{
	int t;cin>>t;XXS();
	for(int T=1;T<=t;T++)
	{
		int n,d;cin>>n>>d;
		if(!YG(n))
		{
			cout<<0<<'\n'<<'\n';continue;
		}
		q.clear();ans.clear();D(ph[n]);
		int g=0;
		for(int i=1;;i++)
		{
			if(__gcd(i,n)==1)
			{
				bool f=1;
				for(int j=0;j<q.size();j++)
					if(K(i,ph[n]/p[j],n)==1)
					{
						f=0;break;
					}
				if(f)
				{
					g=i;break;
				}
			}
		}
		long long res=1;
		for(int i=1;ans.size()<ph[ph[n]];i++)
		{
			res=res*g%n;
			if(__gcd(ph[n],i)==1)ans.push_back(res);
		}
		sort(ans.begin(),ans.end());
		cout<<ph[ph[n]]<<'\n';
		for(int i=d-1;i<ph[ph[n]]/d*d&&i<ans.size();i+=d)
		    cout<<ans[i]<<" ";
		cout<<'\n';
    }
    return 0;
}
2021/5/16 17:32
加载中...