我们根据
P
的大小来分类,当
令
C=∏pi<=Ppi
,假设
i
合法,则
证明:
若
C+i
不合法, 则存在质因子
p<P
且
p∣C+i
,因为
p∣C
,所以
p∣i
,矛盾。
所以找到循环节暴力就行了。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int INF=1000000000;
const int NN=10;
const int MM=10000005;
int n,p;
int prime[NN];
bool flag[NN];
int ans[MM];
inline void pre(int N)
{
for (int i=2;i<=N;i++)
{
if (!flag[i]) prime[++prime[0]]=i;
for (int j=1;j<=prime[0]&&i*prime[j]<=N;j++)
{
flag[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
int main()
{
scanf("%d%d",&n,&p);
if (n==1) printf("%d\n",p);
else if (p>sqrt(INF)) puts("0");
else
{
if (p>=29)
{
int cnt=1;
for (int i=p<<1;i<=INF;i+=p)
{
bool flag=0;
for (int j=2;j<p;j++)
if (i%j==0) {flag=1; break;}
if (!flag) cnt++;
if (cnt==n) {printf("%d\n",i); break;}
}
if (cnt<n) puts("0");
}
else
{
pre(p);
int C=1;
for (int i=1;i<=prime[0];i++) C*=prime[i];
int cnt=0;
for (int i=p;i<=min(C,INF);i+=p)
{
bool flag=0;
for (int j=1;j<=prime[0];j++)
if (i%prime[j]==0&&prime[j]!=p) {flag=1; break;}
if (!flag) ans[++cnt]=i;
}
long long Ans=(long long)(n-1)/cnt*C+ans[(n-1)%cnt+1];
printf("%lld\n",Ans>INF?0:Ans);
}
}
return 0;
}