POJ 1995 Raising Modulo Numbers(快速幂取模)

POJ1995

题目大意

有N个人,每个人给出两个数字a,b,求∑(Ai\^Bi) mod M。

Input

3
16
4
2 3
3 4
4 5
5 6
36123
1
2374859 3029382
17
1
3 18132

Output

2
13195
13

代码

#include 
#include 
typedef long long LL;

LL quick(LL a,LL b,int c)
{
    LL ans=1;   //记录结果
    a=a%c;   //预处理,使得a处于c的数据范围之下
    while(b!=0)
    {
        if(b&1) ans=(ans*a)%c;  //如果b的二进制位不是0,那么我们的结果是要参与运算的
        b>>=1;    //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
        a=(a*a)%c;   //不断的加倍
    }
    return ans;
}

int main()
{
    int t;
    int M,N,i;
    LL e,f;
    scanf("%d",&t);
    while(t--)
    {
        LL sum=0;
        scanf("%d%d",&M,&N);
        for(i=0;iscanf("%lld%lld",&e,&f);
            sum+=quick(e,f,M);
        }
        sum%=M;
        printf("%lld\n",sum);
    }
    return 0;
}

你可能感兴趣的:(POJ 1995 Raising Modulo Numbers(快速幂取模))