码迷,mamicode.com
首页 > 其他好文 > 详细

西电oj1066 费马小定理

时间:2015-05-29 20:02:47      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

西电oj1066 费马小定理

问题 A: A^B % P

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 8
[提交][状态][讨论版]

题目描述

技术分享技术分享

 

输入

技术分享

 

输出

技术分享

 

样例输入

2
3 1 2
2 2 2

样例输出

9
64

思路:先求k=B0*B1*...*Bn-1%(p-1),最后算出A^k%p即为答案。
    依据:由费马小定理,若a,p互质,a^(p-1)=1(mod p);因此,A^(B0*B1*...*Bn-1)%p=A^((p-1)的倍数+((B0*B1*...*Bn-1)%(p-1)))%p=(A^(p-1)的倍数%p)*((A^k)%p)=1*((A^k)%p)=A^k%p;
技术分享
#include<bits/stdc++.h>

using namespace std;

const int maxn=10100;
const int INF=(1<<29);
typedef long long ll;
const ll p=1000000000+7;

int T;
ll A,B0,n;

ll qpow(ll n,ll k)
{
    ll res=1;
    while(k){
        if(k&1) res=(res%p)*(n%p);
        n=(n%p)*(n%p);
        k>>=1;
    }
    return res;
}

ll s(ll x,ll p)
{
    ll res=1;
    p--;
    for(int i=0;i<=n-1;i++){
        res=(res%p)*(x%p)%p;
        x=((x%p)*(x%p)+p-1)%p;
    }
    return res;
}

int main()
{
    cin>>T;
    while(T--){
        cin>>A>>n>>B0;
        ll k=s(B0,p);
        ll ans=qpow(A,k);
        cout<<ans%p<<endl;
    }
    return 0;
}
View Code

 

西电oj1066 费马小定理

标签:

原文地址:http://www.cnblogs.com/--560/p/4539174.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!