CF303D 题解
分析证明
首先我们先设这个整数是
我们设
根据循环数的定义,有
显然
又因为
易得
因此
容易发现的是,实际上
根据以上两行我们得到
接着我们分类讨论
首先,
于是就有了
再看
于是就有了
于是
而此时显然有
又,
故我们需要求出的就是
从
代码
#include<bits/stdc++.h>
using namespace std;
int prime[6000003],vis[6000003];
int cnt=0;
void find(int n)
{
prime[1]=0;
for (int i=2;i<=n;++i)
{
if (!vis[i]) prime[++cnt]=i;
for (int j=1;j<=cnt && i*prime[j]<=n;++j)
{
vis[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
return;
}
int n,x,p,a[6000003],tot=0;
void get(int x){
for(int i=1;i<=cnt;i++) if(!(x%prime[i])) a[++tot]=prime[i];
}
long long qpow(long long a, long long n, long long m)
{
long long ans = 1;
while(n){
if(n&1){ans=(ans * a) % m;}
a=(a*a)%m;
n>>=1;
}
return ans;
}
bool check(long long x){
for(int i=1;i<=tot;i++) {
if(qpow(x,(p-1)/a[i],p)==1)
return 0;
}
return 1;
}
int main(){
int n,x;
cin>>n>>x;
p=n+1;
if((qpow(2,p-1,p)!=1 || qpow(3,p-1,p)!=1 || qpow(5,p-1,p)!=1) && p!=2 && p!=3 && p!=5){
printf("-1");
return 0;
}
find(p);
get(p-1);
for(int i=x-1;i>1;i--)
if(check(i)){
printf("%d",i);
return 0;
}
printf("%d",-1);
}