知识点:快速幂 快速幂的核心:将指数 k 分解为 2 的幂次之和,再将原幂运算拆解为多个 “底数的 2^i 次幂” 的乘积。

快速幂函数

求 m^k mod p,时间复杂度 O(logk)。 m为底数,k为幂

long long qmi(long long m, long long k, long long p)

Q1:p是什么

A1:模数(取模的基数)

Q2:p有什么用

A2:计算高次幂时避免溢出的必要手段

Q3:p为什么取1e9+7

A3:

  1. 1e9+7 是一个 “十亿级” 的数,远大于大多数题目中结果的实际范围,能保证结果在取模前不会丢失信息;
  2. 1e9+7 的平方(约 1e18+...)刚好接近long long类型的上限(2^63-1≈9e18),在快速幂的每步乘法中(res * t % p、t * t % p),乘积不会超出long long的存储范围,避免溢出导致结果失真

快速幂部分:

long long qmi(long long m, long long k, long long p)
{
    long long res=1%p,t=m;
//Q4:为什么不直接写为res=1;
//A4:为了处理 p=1 这个特殊场景
    while (k)// 当指数k不为0时,继续循环
    {
    if(k&1) res=res*t%p;//位运算,用于判断k的二进制最低位是否为1。若结果为1,则k是奇数;若为0,则k是偶数。
    t = t * t % p;
    k >>= 1;//将指数右移一位,丢弃已处理的最低位,接下来处理更高位的二进制位。
    }
    return res;
}

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
// 求 m^k mod p,时间复杂度 O(logk)。
// m为底数,k为幂
long long qmi(long long m, long long k, long long p)
{
    long long res = 1 % p, t = m;
    while (k)
    {
    if (k&1) res = res * t % p;
    t = t * t % p;
    k >>= 1;
    }
    return res;
}
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        long long a, b, c, d, e, f, g;
        cin >> a >> b >> c >> d >> e >> f >> g;
        if((qmi(a, d, 1e9 + 7) + qmi(b, e, 1e9 + 7) + qmi(c, f, 1e9 + 7) == g) && (qmi(a, d, 1e9 + 1) + qmi(b, e, 1e9 + 1) + qmi(c, f, 1e9 + 1) ==g))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}