可以用快速乘时间为log的级别
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll maxn = 1e5 + 5;
//const ll mod = 998244353;
ll mul(ll a,ll b,ll mod)
{
ll ans = 0;
a %= mod;
while(b)
{
if(b & 1)ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans % mod;
}
ll qpow(ll a,ll b,ll mod)
{
ll ans = 1;
a %= mod;
while(b)
{
if(b & 1)ans = mul(ans,a,mod);
a = mul(a,a,mod);
b >>= 1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll t;
cin >> t;
while(t--)
{
ll a,b,mod;
cin >> a >> b >> mod;
cout << qpow(a,b,mod) << endl;
}
return 0;
}
或者用long double解决
大家或许看代码 有疑问为什么a * b 都爆了longlong却还可以减,因为运算之时相当于把高位给舍弃了只保留后面的数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll maxn = 1e5 + 5;
//const ll mod = 998244353;
ll mul(ll a,ll b,ll mod)
{
ll c = (ld) a * b / mod;
c = a * b - c * mod;
if(c < 0)c += mod;
else if(c >= mod)c -= mod;
return c;
}
ll qpow(ll a,ll b,ll mod)
{
ll ans = 1;
a %= mod;
while(b)
{
if(b & 1)ans = mul(ans,a,mod);
a = mul(a,a,mod);
b >>= 1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll t;
cin >> t;
while(t--)
{
ll a,b,mod;
cin >> a >> b >> mod;
cout << qpow(a,b,mod) << endl;
}
return 0;
}