poj 1995 整数快速幂模m

来源:互联网 发布:java游戏高级编程 pdf 编辑:程序博客网 时间:2024/06/05 02:57

题意:做codeforces碰到的矩阵快速幂,学的过程中顺便学学这种二分幂的方法。题意就是求ai^bi进行累加和,最后模m。

思路:将幂转化成二进制来算。

#include<iostream>#include<cstdio>using namespace std;int main() {    long long Z , M , H , a , b;    scanf("%lld",&Z);    while (Z--) {        scanf("%lld",&M);        scanf("%lld",&H);        long long ans , sum = 0;        for(int i = 0 ; i < H ; i ++) {            scanf("%lld%lld",&a,&b);            ans = 1;            while(b) {              //b转化成二进制                 if (b&1) {          //最后一位是1的情况才处理                     ans = (ans*a)%M;                    b--;                    }                   //最后一位不是1的情况只是算出当前位的a^2^i即可                 b/=2;                a = (a*a)%M;        //a的2的i次方 等于a的2的i-1次方的平方  把所有的a^2^i列举出来             }            sum += (ans%M);            }        printf("%lld\n",sum%M);            }    }