初看本题我以为是大数相乘,当时就吓懵了,后来想到了快速幂和取模,代码基础如下:
“判断两个数a,b是否相等,如果膜上10相等,膜上11相等。那么有a + k*110 = b。(110是10和11的最小公倍数),当取的是1e9+1,……1e9+100。那上面的110变成上面这一串数的最小公倍数。两个数不相等的概率就很小了。取模数更多,公倍数更大。
”
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const ll mod1 = 998244353;
ll n,num=0;
ll a,b,c,d,e,f,g;
ll qpow(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
ll qpow1(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans=ans*x%mod1;
x=x*x%mod1;
y>>=1;
}
return ans;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a>>b>>c>>d>>e>>f>>g;
if(qpow(a,d)+qpow(b,e)+qpow(c,f)==g%mod&&qpow1(a,d)+qpow1(b,e)+qpow1(c,f)==g%mod1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}