#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define ll long long
#define inf 0x3f3f3f3f
#define N 100005
#define MOD 1000000007
ll prime[N],sum;
ll p,r;
struct Ys
{
ll num;
ll len;
ll cnt[N];
ll ys[N];
}temp;
ll ys[N],cnt;
void get_prime()
{
ll i,j,flag;
prime[0]=2;
sum=1;
for(i=3;i<=100000;i++)
{
flag=1;
for(j=0;prime[j]*prime[j]<=i&&j<sum;j++)
{
if(i%prime[j]==0)
{
flag=0;break;
}
}
if(flag)prime[sum++]=i;
}
}
void fj(ll num)
{
temp.len=0;
temp.num=num;
ll i;
for(i=0;i<sum&&prime[i]*prime[i]<=num;i++)
{
if(num%prime[i]==0)
{
temp.ys[temp.len]=prime[i];
temp.cnt[temp.len]=1;
num/=prime[i];
while(num%prime[i]==0)temp.cnt[temp.len]++,num/=prime[i];
temp.len++;
}
}
if(num!=1)
{
temp.ys[temp.len]=num;
temp.cnt[temp.len]=1;
temp.len++;
}
}
ll pm(ll x,ll y)
{
ll ret=1;
while(y--)ret*=x;
return ret;
}
void dfs(ll dep,ll num)
{
if(dep==temp.len)
{
ys[cnt++]=num;
return;
}
ll i;
for(i=0;i<=temp.cnt[dep];i++)dfs(dep+1,num*pm(temp.ys[dep],i));
}
ll powermod(ll x,ll y,ll m)
{
ll temp=x%m,ret=1;
while(y)
{
if(y&1)ret=ret*temp%m;
temp=temp*temp%m;
y>>=1;
}
return ret;
}
ll gcd(ll x,ll y)
{
if(x<y)return gcd(y,x);
if(x%y==0)return y;
return gcd(y,x%y);
}
int main()
{
get_prime();
ll t,i,flag;
while(scanf("%lld%lld",&p,&t)!=EOF)
{
if(p+t==0)break;
fj(p-1);
dfs(0,1);
while(t--)
{
scanf("%lld",&r);
if(p==2)printf("YES\n");
else if(gcd(p,r)!=1)printf("NO\n");
else
{
flag=1;
for(i=0;i<cnt-1;i++)
{
if(powermod(r,ys[i],p)<=1)
{
flag=0;break;
}
}
if(flag)printf("YES\n");
else printf("NO\n");
}
}
printf("\n");
}
return 0;
}
UESTC 1896(数论)
最新推荐文章于 2019-10-18 11:01:01 发布