2020牛客寒假算法基础集训营2——G.判正误【快速幂】(奇葩题?)

题目传送门


题目描述

牛可乐有七个整数 a , b , c , d , e , f , g \text{}a,b,c,d,e,f,g 并且他猜想 a d + b e + c f = g a^d+b^e+c^f=g 。但 牛可乐无法进行如此庞大的计算。
请验证 牛可乐的猜想是否成立。


输入描述:

第一行一个正整数 T,表示有 T 组数据。
每组数据输入一行七个整数 a , b , c , d , e , f , g \text{}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
保证不会出现指数和底数同为 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

11451 4 2 + 191981 0 3 + 1 4 1 114514^2+1919810^3+1^4\neq1


题解

  • 直接计算会 TLE / MLE ,考虑在模意义下进行计算,若 a d + b e + c f g ( m o d M ) a^d+b^e+c^f\equiv g \pmod M ,则原式有概率成立,多选择一些模数以提高正确率。 ( ? ? ? ? ? ? ? ) (???????)

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;
 
    }
}
发布了157 篇原创文章 · 获赞 99 · 访问量 9810

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104213646