[CF1155E]Guess the Root
壹、题目描述 ¶
贰、题解 ¶
询问 \(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;
}