nylg 640 Geometric Sum

Geometric Sum

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
 
描述
Compute (a + a^2 + … + a^n) mod m. (a+a2+an)mod
 
输入
Three integers a,n,m.
(1≤a,n,m≤10^18)
It ends with EOF.
输出
The only integer denotes the result.
样例输入
2 2 1000000000
样例输出
6 
来源
Lepus
 矩阵里也求过a+a^2+a^3+a^4.......
 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<vector>

 6 using namespace std;

 7 typedef long long LL;

 8 

 9 LL sum_mod(LL a,LL n,LL p)

10 {

11     LL ans=0;

12     n=n%p;

13     while(n)

14     {

15         if(n&1)

16         {

17             ans=ans+a;

18             if(ans>=p) ans=ans-p;

19         }

20         n=n>>1;

21         a=(a+a)%p;

22     }

23     return ans;

24 }

25 LL solve(LL a,LL n,LL p)

26 {

27    LL p1=a,p2=a,ans,i;

28    vector<LL>Q;

29    while(n)

30    {

31        ans=(n&1);

32        Q.push_back(ans);

33        n=n>>1;

34    }

35    ans=Q.size()-2;

36    for(i=ans;i>=0;i--)

37    {

38        p1=sum_mod(p1,p2+1,p);

39        p2=sum_mod(p2,p2,p);

40        if(Q[i]==1)

41        {

42            p2=sum_mod(p2,a,p);

43            p1=(p1+p2)%p;

44        }

45    }

46    return p1;

47 }

48 int main()

49 {

50     LL a,n,p;

51     while(scanf("%lld%lld%lld",&a,&n,&p)>0)

52     {

53         if(n==1){

54             printf("%lld\n",a%p);

55             continue;

56         }

57         LL ans=solve(a,n,p);

58         printf("%lld\n",ans);

59     }

60     return 0;

61 }

 

你可能感兴趣的:(SUM)