题意:给出A1,…,AH,B1,…,BH以及M,求(A1^B1+A2^B2+ … +AH^BH)mod M.
思路:快速幂
实例
3^11 11=2^0+2^1+2^3 =》 3^1*3^2*3^8=3^11
实现代码:
int solve(int a,int b)
{ int ans=1;
while(b){ if(b&1) ans=ans*a; a=a*a; b>>=1;}
}
解释一下代码:b&1即二进制表达式的最后一位, 11二进制为 1011 b>>=1 去掉二进制的最后一位
模的运算 (a^b)%p=(a%p)^b%p
解决问题的代码:
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll mod_m(ll a, ll b, int p) { ll ans = 1ll; a %= p; while (b) { if (b & 1) ans = (ans*a) % p; a = (a*a) % p; b >>= 1; } return ans; } int main() { int t; scanf("%d", &t); while (t--) { ll ans = 0ll; int m; scanf("%d", &m); int h; scanf("%d", &h); while (h--) { ll a, b; scanf("%lld%lld", &a, &b); ans += mod_m(a, b, m); } printf("%lld ", (ans%m)); } return 0; }