快速幂取模,POJ(1995)

题目链接:http://poj.org/problem?id=1995

参考:http://www.cnblogs.com/PegasusWang/archive/2013/03/13/2958150.html

解题报告:

#include <iostream>
#include <stdio.h>
#include <algorithm>

using namespace std;

///a^b%c=?
int PowerMod(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b>0)
    {
        if(b%2==1)
            ans=(ans*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return ans;
}

int mod_exp(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b)
    {
        if(b&1)
            ans=ans*a%c;
        a=a*a%c;
        b=b>>1;
    }
    return ans;
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int ans=0;
        int mod;
        int n;
        scanf("%d%d",&mod,&n);

        for(int i=0;i<n;i++)
        {
            //ans=0;
            int a,b;
            scanf("%d%d",&a,&b);
            ans=(ans%mod+mod_exp(a,b,mod))%mod;
        }
        printf("%d
",ans);
    }
    return 0;
}
View Code

快速幂取模:

1、

int ans=1;
for(int i=1;i<=b;i++)
    ans=ans*a;
ans=ans%c;

2、

int ans=1;
a=a%c;
for(int i=1;i<=b;i++)
    ans=ans*a;
ans=ans%c;

3、

int ans=1;
a=a%c;
for(int i=1;i<=b;i++)
    ans=(ans*a)%c;
ans=ans%c;

4、

int ans=1;
a=a%c;
if(b%2==1)
    ans=(ans*a)%c;
int k=(a*a)%c;

for(int i=1;i<=b/2;i++)
    ans=(ans*k)%c;
ans=ans%c;

5、

int PowerMod(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b>0)
    {
        if(b%2==1)
            ans=(ans*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return ans;
}

6、

int mod_exp(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b)
    {
        if(b&1)
            ans=ans*a%c;
        a=a*a%c;
        b=b>>1;
    }
    return ans;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5394687.html