CF1155Eはルート题を推測解

ディレクトリ

トピックリンク

cf1155E

ソル

思考

我々はすべて知っているように、n個の点は、私たちが11回を尋ねたように、この多項式を決定することができ、程度のn-1の多項式を決定することができます。11缶尋ねた後、ガウスの消去ラグランジュを、暴力の後に0 1e6-3間のテストの数をもたらしました。

スコア、逆ラグランジュ簡単に使用し、必要があるかもしれません。

コード

#include<bits/stdc++.h>
using namespace std;
const int mod=1e6+3;
inline int powmod(int a,int b) {
    int ans=1;
    while(b) {
        if(b&1)ans=1ll*ans*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return ans;
}
int p[11];
int qry(int a) {//交互询问
    printf("? %d\n",a);fflush(stdout);
    int t;
    cin>>t;
    return t;
}
void write(int i) {//交互输出
    printf("! %d\n",i);fflush(stdout);
    exit(0);
}
int main() {
    for(int i=0;i<=10;i++) {//先问11次
        p[i]=qry(i);
        if(!p[i])write(i);
        for(int j=0;j<=10;j++) {
            if(i==j)continue;
            p[i]=1ll*p[i]*powmod(i-j,mod-2)%mod;//拉格朗日插值,顺便考虑逆元。
        }
    }
    for(int i=11;i<mod;i++) {//暴力代入
        int v=0;
        for(int j=0;j<=10;j++) {
            int val=1;
            for(int k=0;k<=10;k++) {
                if(j==k)continue;
                val=1ll*val*(i-k)%mod;
            }
            v=(v+1ll*val*p[j])%mod;
        }
        if(v==0)write(i);
    }
    write(-1);
    return 0;
}

おすすめ

転載: www.cnblogs.com/hht2005/p/11862892.html