Educational Codeforces Round 63 (Rated for Div. 2) E 帶模高斯消元
阿新 • • 發佈:2019-05-05
oid std 方程 void 消元 高斯消元 lock print scan
https://codeforces.com/contest/1155/problem/E
題意
\(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq a_i < 10^6+3\),每次可以詢問一個x,返回\(f(x)mod(10^6+3)\),50次詢問以內需要找到x使得 \(f(x) \equiv 0 mod(10^6+3)\)
題解
- 現未知\(a_0,a_1,...,a_k\),一共k+1個未知數,需要k+1個方程來解,因此只需要詢問k+1次即可
- 將x看成系數,\(a_0,a_1,...,a_k\)當成未知數,帶模高斯消元即可
代碼
#include<bits/stdc++.h> #define ll long long using namespace std; const ll P=1e6+3; ll a[15][15],b[15]; int ask(int i){ printf("? %d\n",i); fflush(stdout); int x;scanf("%d",&x); return x; } ll inv(ll bs){ ll ans=1,x=P-2; while(x){ if(x&1)ans=ans*bs%P; bs=bs*bs%P; x>>=1; } return ans; } void gao(){ for(int i=0;i<=10;i++){ for(int j=i+1;j<=10;j++){ ll rate=a[j][i]*inv(a[i][i])%P; for(int k=i;k<=11;k++){ a[j][k]-=a[i][k]*rate%P; a[j][k]+=P;a[j][k]%=P; } } } for(int i=10;i>=0;i--){ for(int j=i-1;j>=0;j--){ ll rate=a[j][i]*inv(a[i][i])%P; a[j][11]-=a[i][11]*rate%P; a[j][11]+=P;a[j][11]%=P; } a[i][i]=a[i][11]*inv(a[i][i])%P; } } int chk(ll x){ b[0]=1; for(int i=1;i<=10;i++)b[i]=b[i-1]*x%P; ll sum=0; for(int i=0;i<=10;i++){ sum+=b[i]*a[i][i]%P; sum%=P; } return sum==0; } int main(){ for(int i=0;i<=10;i++){ a[i][11]=ask(i); ll p=1; for(int j=0;j<=10;j++){ a[i][j]=p; p=p*i%P; } } gao(); for(int i=0;i<P;i++){ if(chk(i)){ printf("! %d\n",i); fflush(stdout); return 0; } } printf("! -1\n");fflush(stdout); }
Educational Codeforces Round 63 (Rated for Div. 2) E 帶模高斯消元