题目描述
牛可乐有七个整数
a
,
b
,
c
,
d
,
e
,
f
,
g
\text{}a,b,c,d,e,f,g
a,b,c,d,e,f,g 并且他猜想
a
d
+
b
e
+
c
f
=
g
a^d+b^e+c^f=g
ad+be+cf=g 。但 牛可乐无法进行如此庞大的计算。
请验证 牛可乐的猜想是否成立。
输入描述:
第一行一个正整数 T,表示有 T 组数据。
每组数据输入一行七个整数
a
,
b
,
c
,
d
,
e
,
f
,
g
\text{}a,b,c,d,e,f,g
a,b,c,d,e,f,g 。
保证
1
≤
T
≤
1000
,
−
1
0
9
≤
a
,
b
,
c
,
g
≤
1
0
9
1\leq T \leq 1000 , -10^9\leq a,b,c,g\leq 10^9
1≤T≤1000,−109≤a,b,c,g≤109
保证不会出现指数和底数同为 0 的情况。
输出描述:
每组数据输出一行,若猜想成立,输出 Yes ,否则输出 No。
输入
2
1 1 4 5 1 4 258
114514 1919810 1 2 3 4 1
输出
Yes
No
说明
1 5 + 1 1 + 4 4 = 258 1^5+1^1+4^4=258 15+11+44=258
11451 4 2 + 191981 0 3 + 1 4 ≠ 1 114514^2+1919810^3+1^4\neq1 1145142+19198103+14=1
题解
- 直接计算会 TLE / MLE ,考虑在模意义下进行计算,若 a d + b e + c f ≡ g ( m o d M ) a^d+b^e+c^f\equiv g \pmod M ad+be+cf≡g(modM),则原式有概率成立,多选择一些模数以提高正确率。 ( ? ? ? ? ? ? ? ) (???????) (???????)
AC-Code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
ll q_pow(ll a, ll n) {
ll res = 1;
while (n > 0) {
if (n & 1) res = ((res % mod) * a % mod) % mod;
a = (a * a) % mod;
n >>= 1;
}
return res % mod;
}
int main() {
int T; cin >> T;
while (T--) {
ll a, b, c, e, d, f, g; cin >> a >> b >> c >> d >> e >> f >> g;
if (q_pow(a % mod, d) + q_pow(b % mod, e) + q_pow(c % mod, f) == g % mod)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}