一、高精度+快速幂
用法:若题干让求A^B%M,当A超出long long范围,或者用普通的快速幂取模在运算过程中会爆值的情况下,应用高精度取模简化A,来防止爆值。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fastPow(ll a, ll n, ll mod)
{
ll res = 1, base = a;
while (n)
{
if (n & 1)
res = res * base % mod;
base = base * base % mod;
n >>= 1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
string a;
ll b, m, tmp = 0, ans;
cin >> a >> b >> m;
for (int i = 0; i < a.size(); i++)//高精度取模
tmp = (tmp * 10 + a[i] - '0') % m;
ans = fastPow(tmp, b, m);
cout << ans << endl;
return 0;
}
- 应用:Days passing
二、在快速幂过程中long*long的处理
在快速幂的过程中出现long*long的情况下,会爆出值,现在可以乘法变加法来处理。
long long mod_mul(long long a, long long n, long long mod) //快速乘(a*b)%n
{
long long res = 0;
while (n)
{
if (n & 1)
res = (res + a) % n;
a = (a + a) % n;
n >>= 1;
}
return res;
}
long long mod_fastPow(long long a, long long n, long long mod) //快速幂(a^b)%n
{
long long res = 1, base = a;
while (n)
{
if (n & 1)
res = mod_mul(res, base, mod);
base = mod_mul(base, base, mod);
n >>= 1;
}
return res;
}