[CF1155E]Guess the Root

壹、题目描述 ¶

传送门 to Luogu

贰、题解 ¶

询问 \(11\) 次之后就可以确定这个函数了。

然后使用 \(\tt Lagrange\) 插值法将 \([0,10^6+3)\) 的值全部带入暴力差就行了。

叁、参考代码 ¶

时间复杂度有点卡,不预处理逆元可能会 \(\color{darkblue}{\text{TLE}}\).

const int mod=1e6+3;
const int n=11;

inline int qkpow(int a, int n){
	int ret=1;
	for(; n>0; n>>=1, a=1ll*a*a%mod)
		if(n&1) ret=1ll*ret*a%mod;
	return ret;
}

int y[15];

inline int query(int x){
	printf("? %d\n", x); fflush(stdout);
	return readin(1);
}

inline void guess(int x){
	printf("! %d\n", x); fflush(stdout);
	return;
}

signed main(){
	for(int i=1; i<=n; ++i){
		y[i]=query(i);
		if(!y[i]) return guess(i), 0;
		for(int j=1; j<=n; ++j) if(j!=i)
			y[i]=1ll*y[i]*qkpow(i-j, mod-2)%mod;
	}
	for(int i=0; i<mod; ++i){
		int f=0;
		for(int j=1; j<=n; ++j){
			int val=y[j];
			for(int k=1; k<=n; ++k) if(k!=j)
				val=1ll*val*(i-k)%mod;
			f=(f+val)%mod;
		}
		if(!f) return guess(i), 0;
	}
	guess(-1);
	return 0;
}
posted @ 2021-04-05 17:21  Arextre  阅读(49)  评论(0编辑  收藏  举报