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;
}
}