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)
快速幂的过程中 用到 二分
求和的过程也用到二分.
快速幂就不多说了.
不了解的-->:
关于求和的过程:
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; } }