开了 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();
}
}