快速幂模+二分求和 求(∑A^b)%C

 b=B

(A^b)%C 

 b=1

 *problem:
 *输入A,B,C
 *SUM = A + A^2 + A^3 + ... + A^B
 *求 SUM % C
 *A(1~10^9) B(1~10^9) C(1~10^9)

快速幂的过程中 用到 二分

求和的过程也用到二分.

快速幂就不多说了.

不了解的-->:

HDU 1420 蒙哥马利幂模算法

 

关于求和的过程:

A = A

A+A^2+A^3+A^4 =A+A^2 + (A+A^2)*A^2  //指数偶数

A+A^2+A^3+A^4+A^5=A+A^2+A^3+(A+A^2)*A^3  //指数奇数


/*
 *problem:
 *输入A,B,C
 *SUM = A + A^2 + A^3 + ... + A^B
 *求 SUM % C
 *A(1~10^9) B(1~10^9) C(1~10^9)
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#ifndef __int64
#define __int64 long long
#endif


__int64 Muli_Mod(__int64 A, __int64 B, __int64 C)  //二分,快速幂模
{
    __int64 temp = 1;
    while(B)
    {
        if(B&1)
        {
            temp *= A;
            temp %= C;
        }
        A *= A;
        A %= C;;
        B>>=1;
    }
    return temp;
}

__int64 SUM(__int64 A, __int64 B, __int64 C)  //二分,快速求和
{
    if(B == 1) return A;
    else
    {
        __int64 temp1 = SUM(A, B>>1, C);
        __int64 temp2;
        if(B&1)
        {
            temp2 = Muli_Mod(A, (B>>1) + 1, C);
            return (temp1 + temp2 + temp1*temp2)%C;
        }
        else
        {
            temp2 = Muli_Mod(A, B>>1, C);
            return (temp1 + temp1*temp2)%C;
        }
    }
}

int main()
{
    __int64 A,B,C;
    while(cin>>A>>B>>C)
    {
        cout<<SUM(A,B,C) % C<<endl;
    }
}


你可能感兴趣的:(快速幂模+二分求和 求(∑A^b)%C)