A^B mod C(快速幂模板)

讲解链接:http://blog.csdn.net/zhq0808/article/details/62245545
很详细的文章。


<板子>

题目描述:
数论课上,老师给 DreamFox 安排了一项任务,用编程实现 A 的 B 次方模 C 。这个当然难不了 ACMer 。于是 DreamFox 回去后就开始用代码实现了。

输入格式:
三个整数:a,b,c(0≤a,c<231,0≤b<263)。

输出格式:
一个整数,即 ab mod c 的结果。

样例数据 1:
输入
5 100000000000000 12830603

输出:
5418958


代码:

#include
using namespace std;

long long a,b,c;

inline void ksm()
{
    long long ans=1;

    a=a%c;

    while(b>0)
    {
        if(b&1) ans=(ans*a)%c;

        b=b>>1;

        a=(a*a)%c;
    }

    cout<int main()
{
    cin>>a>>b>>c;

    ksm();

    return 0;
}

<加强版>

题目描述:
2015年1月1日,国际卫生组织公布了一种新型病毒CAI,其复制能力极强,会使人的记忆能力严重衰退。

在每 1 秒内,一个病毒会分身出 N 个病毒(本体不计),它们和本体拥有着同样的能力,如果 N=4,在第一秒初有 1 个病毒本体,第一秒末分裂出 4 个,那么第一秒末有 5 个,它们在第二秒末会再分裂 5*4 =20个,那么加上最开始的,第二秒末就有 25 个。

为了抑制这种可怕的病毒,清华大学的医学研究人员经过认真研究这种病毒的基因,发明了一种新型青霉素注射液,能有效的消灭这种病毒。人体只需要注射一次这种青霉素,就可以终身免疫。这种青霉素杀毒的前提是:当病毒的数量必须达到或者超过 P 个(对人体开始有害),药力才会自动发挥作用——瞬间全部消灭 P 个病毒。那么,在第 M 秒末,环境中还有多少病毒呢?(注,第一秒初开始就注射了青霉素)

输入格式:
输入数据只有一行,为 3 个整数 N、M 和 P,其含义如题目描述(初始时,只有一只病毒)。

输出格式:
输出数据只有一行,为第 M 秒最后剩余的病毒数目。

样例数据 1
输入
4 3 3

输出
2

样例数据 2
输入
10000 1000 1

输出
0

备注:
【样例1说明】
第一秒的病毒分裂出 4 个,加上本体就是 5 个,消灭三个还剩两个。
第二秒的病毒分裂出 2*4=8 个,加上两个本体就是 10 个,药力发挥 3 次,消灭了 9 个,还剩一个。
第三秒剩下的那个分裂出 4 个,加上本体就是 5 个,药力发挥一次消灭三个,还剩两个。

【样列2说明】
只要有 1 个病毒,药力就发挥杀毒功能,显然没有病毒能活下来。

【数据范围】
对于 1/3 的数据:M≤100000;
对于 2/3 数据:1≤N,P≤2^30,1≤M≤1152921504606846976;
对于 3/3 数据:1≤N≤2^30,1≤P≤2^60,1≤M≤1152921504606846976


代码:

#include
using namespace std;

inline long long ksc(long long a,long long b,long long c)
{
    long long tot=0;

    while(b)
    {
        if(b&1) tot=(tot+a)%c;

        b=b>>1;

        a=a*2%c;
    }

    return tot;
}

inline long long work(long long a,long long b,long long c)
{
    long long ans=1;

    while(b)
    {
        if(b&1) ans=ksc(ans,a,c);

        b=b>>1;

        a=ksc(a,a,c);
    }

    return ans;
}

int main()
{
    long long a,b,c;

    cin>>a>>b>>c;

    cout<1,b,c)<return 0;
}

<推荐练习题目链接>

HDU5187—>zhx’s contest
http://acm.split.hdu.edu.cn/showproblem.php?pid=5187

你可能感兴趣的:(模板题)