幂取模

例题: 幂取模
输入正整数a、n和m ,输出a^n mod m 的值。a,n,m<=10^9.

第一种方法:(很容易想出)

View Code
#include <iostream>
using namespace std;
int pow_mod(int a,int n,int m)
{
    int ans=1;
    for(int i=0; i<n; i++)
        ans=(int)((long long)ans*a % m);
    return ans;
}
int main()
{
    int a,n,m;
    cin>>a>>n>>m;
    cout<<pow_mod(a,n,m)<<endl;
    return 0;
}

上面写的函数的时间复杂度为O(n) ,当n 很大时速度很不理想。有没有办法算得更快呢?下面用分治法

第二种方法:

View Code
#include <iostream>
using namespace std;
int pow_mod(int a,int n,int m)
{
    if(n==1) return a%m;
    int x=pow_mod(a,n/2,m);
    long long ans=(long long)x*x % m;
    if(n%2==1)
        ans=ans*a % m;
    return (int)ans;
}
int main()
{
    int a,n,m;
    cin>>a>>n>>m;
    cout<<pow_mod(a,n,m)<<endl;
    return 0;
}
posted @ 2012-08-13 15:49  luosw  阅读(153)  评论(0编辑  收藏  举报