高斯消元求主元——模意义下的消元cf1155E
#include <bits/stdc++.h> const int N = 20, MO = 1000003; int a[N][N], n = 10; inline int qpow(int a, int b) { int ans = 1; while(b) { if(b & 1) { ans = 1ll * ans * a % MO; } a = 1ll * a * a % MO; b = b >> 1; } return ans; } inline void Gauss() { for(int i = 0; i < n; i++) { for(int j = i + 1; j <= n; j++) { if(a[j][i]) { std::swap(a[j], a[i]); break; } } if(!a[i][i]) continue; int inv = qpow(a[i][i], MO - 2); for(int j = i + 1; j <= n; j++) { if(!a[j][i]) continue; int p = 1ll * a[j][i] * inv % MO; for(int k = i; k <= n + 1; k++) { a[j][k] -= 1ll * a[i][k] * p % MO; a[j][k] = (a[j][k] % MO + MO) % MO; } } } for(int i = n; i > 0; i--) { a[i][n + 1] = 1ll * a[i][n + 1] * qpow(a[i][i], MO - 2) % MO; a[i][i] = 1; for(int j = i - 1; j >= 0; j--) { if(!a[j][i]) continue; int p = a[j][i]; a[j][i] -= p; a[j][n + 1] -= 1ll * a[i][n + 1] * p % MO; a[j][n + 1] = (a[j][n + 1] % MO + MO) % MO; a[j][i] = (a[j][i] % MO + MO) % MO; } } return; } inline int cal(int x) { int ans = 0, temp = 1; for(int i = 0; i <= n; i++) { (ans += 1ll * temp * a[i][n + 1] % MO) %= MO; temp = 1ll * temp * x % MO; } return ans; } int main() { for(int i = 0; i <= n; i++) { fflush(stdout); printf("? %d \n", i); fflush(stdout); scanf("%d", &a[i][n + 1]); fflush(stdout); a[i][0] = 1; for(int j = 1; j <= n; j++) { a[i][j] = 1ll * a[i][j - 1] * i % MO; } } Gauss(); int ans = -1; for(int i = 0; i < MO; i++) { if(!cal(i)) { ans = i; break; } } printf("! %d \n", ans); return 0; }