Codechef GUESSPRM Guess the Prime!
Link
先询问\(2^{15}\),假设交互库回答的是\(t\),那么\(x=2^{30}-t\)满足\(P|x\)。
不难发现\(P=2\Leftrightarrow t=0\),因此我们先特判此种情况。
此时\(P\)一定是奇素数,所以我们去掉\(x\)的\(2\)因子。
那么此时\(\frac{x+1}2\equiv\frac12\pmod P\),我们询问\(\frac{x+1}2\)得到\(y\),那么\(y\equiv\frac14\pmod P\)。
若\(P\equiv1\pmod 4\),那么\(y=\frac{3P+1}4,P=\frac{4y-1}3\)。
若\(P\equiv3\pmod 4\),那么\(y=\frac{P+1}4,P=4y-1\)。
显然\(\frac{4y-1}3,4y-1\)不可能同时为素数,判断一下就行了。
#include<cctype>
#include<cstdio>
using u32=unsigned int;
char str[10];
u32 read(){u32 x=0,c=getchar();while(isspace(c))c=getchar();while(isdigit(c))(x*=10)+=c&15,c=getchar();return x;}
u32 ask(u32 x){return printf("1 %u\n",x),fflush(stdout),read();}
void answer(u32 x){printf("2 %u\n",x),fflush(stdout),scanf("%s",str);}
int main()
{
for(u32 T=read(),x,y;T;--T)
{
x=ask(1<<15);
if(!x){answer(2);continue;}
for(x=(1<<30)-x;~x&1;x>>=1);
y=ask((x+1)/2),(4*y-1)%3||y==1? answer(4*y-1):answer((4*y-1)/3);
}
}