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);
    }
}
posted @ 2020-04-22 07:19  Shiina_Mashiro  阅读(220)  评论(0编辑  收藏  举报