可以用快速乘时间为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;
}
本文介绍了一种高效的大数乘法和快速幂运算算法,通过使用位操作和模运算,实现时间复杂度为O(log n)的算法。文章提供了两种实现方式:一种是基于整数模运算的快速乘法,另一种是利用long double类型进行大数运算,避免整数溢出。代码示例中详细展示了如何使用这些技巧来加速乘法和幂运算。

757

被折叠的 条评论
为什么被折叠?



