Strange Homura Game 题解

· · 题解

思路

先简化一下式子:

&\begin{cases} x_1=am+b\\ x_2=cm+d \end{cases}\\ &\begin{cases} x_1\equiv b\pmod m\\ x_2\equiv d\pmod m \end{cases}\\ &\begin{cases} x_1-b\equiv 0\pmod m\\ x_2-d\equiv 0\pmod m \end{cases}\\ &\begin{cases} m\mid(x_1-b)\\ m\mid(x_2-d) \end{cases} \end{aligned}

相当于 m\mid\gcd(x_1-b,x_2-d)

到这里还是无法直接确定 m,因为 \gcd 可能有多个因数。

显然 x_1,x_2 必须 >10^{17} 否则可能 \le m 浪费询问机会。

构造 x_1=10^{17}+3(大质数),令 c_1=x_1\bmod m

构造 x_2=2(x_1-c_1)-1,令 c_2=x_2\bmod m

证明:数学直觉。 ### 代码 ```cpp #include <bits/stdc++.h> #define ll long long #define N 10 using namespace std; ll P1 = 100000000000000003, P2; ll qpow(ll x, ll k, ll MOD) { ll ret = 1, base = x; while (k) { if (k & 1) ret = (ret * base) % MOD; base = (base * base) % MOD; k >>= 1; } return ret; } ll gcd(ll x, ll y) { while (x ^= y ^= x ^= y %= x); return y; } ll T, c1, c2; int main() { scanf("%lld", &T); while (T--) { printf("? %lld\n", P1); fflush(stdout); scanf("%lld", &c1); P2 = (P1 - c1) * 2 - 1; printf("? %lld\n", P2); fflush(stdout); scanf("%lld", &c2); printf("! %lld\n", gcd(P1 - c1, P2 - c2)); fflush(stdout); } return 0; } ```