记忆崩塌.官方题解
设
令
我们可以询问
那么,我们就可以用
注意到,这样做只能得到前三个 subtask 的分。输出一下每个解是膜多少的剩余类,发现所有的都大于
std:
#include<bits/stdc++.h>
using namespace std;
const int NN=1004,P=998244353;
int prime[NN],vis[NN*100];
int qmi(int a,int b)
{
int res=1;
while(b)
{
if(b&1)
res=1ll*res*a%P;
a=1ll*a*a%P;
b>>=1;
}
return res;
}
int bsgs(int a,int b)
{
if(1%P==b%P)
return 0;
unordered_map<int,int>hash;
int k=sqrt(P)+1;
for(int i=0,j=b%P;i<k;i++)
{
hash[j]=i;
j=1ll*j*a%P;
}
int ak=1;
for(int i=1;i<=k;i++)
ak=1ll*ak*a%P;
for(int i=1,j=ak;i<=k;i++)
{
if(hash.count(j))
return i*k-hash[j];
j=1ll*j*ak%P;
}
return -1;
}
int main()
{
vis[1]=true;
int cnt=0;
for(int i=2;cnt<=1000;i++)
if(!vis[i])
{
prime[++cnt]=i;
for(int j=i*i;j<=1e5;j+=i)
vis[j]=true;
}
int ans=1;
for(int i=1;i<=cnt;i++)
{
printf("GetGCD. 1 %d 1000000\n",prime[i]);
fflush(stdout);
int k;
scanf("%d",&k);
int t=bsgs(prime[i],k);
ans=1ll*ans*((k+1ll*k*(prime[i]-1)%P*qmi(prime[i],P-2)%P*t%P)%P)%P;
}
printf("IFoundTheAnswer! %d",ans);
return 0;
}