快速幂模+二分求和 求(∑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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值