poj 1995 快速幂

题意:给出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;
}
君子知命不惧,自当日日自新
原文地址:https://www.cnblogs.com/xuxiaojin/p/9407607.html