当你把费马小定理和快速幂算法结合起来会发生什么?(喜)

{注明:这并不是一个很详细的教程,而是我有感而发随便写的}

众所周知,费马小定理是数论里的一个小小却很难(应用)的定理,有两个公式如下:

a^p≡a(mod p)

a^(p-1)≡1(mod p)

而快速幂算法是一个神奇的小算法,能够在O(logb)的时间复杂度内进行a^b的幂运算(pow(a,b)的时间复杂度是O(b))!它可以递归实现,也可以while实现!

那如果把两者结合起来呢?

下面提供的代码,包括了问题(我自己编的,快夸我快夸我)和代码解法!

// 今天自己搞一道题来做做
// 题目描述:利用费马小定理的性质求两个等余数(mod p)的序列,中间空格隔开。如果p不是质数,就输出"Can't use the theorem";
// 否则输出等余数序列!
// 输入样例:1 13
// 输出样例: 1 1 1 1
// 样例解释:
// 因为 a^p同余于a(mod p)
// a^(p-1) 同余于 1 (mod p)
// 所以输出
// 1(1^13) 1(1(a)) 1(1^12) 1(1)
// 时间限制:1秒内
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//为了方便打字
ll a,p;
bool prime(ll a){
    for(ll i=2;i*i<=a;i++){
        if(a%i==0) return false;
    }
    return true;
}//判断质数
ll fastpower(ll a,ll b){
    if(b==0) return 1;//边界,任何数的零次方得1
    int store = fastpower(a,b/2);//提前准备的变量
    return b%2==0 ? store*store : store*store*a;//三目运算,快速幂的返回值,是若幂奇数,返回(a^(b/2))^2*a,否则少乘一个a
}
int main(){
    cin>>a>>p;
    if(!prime(p)) cout<<"Can't use the theorem";//如果p不是质数,输出不可使用定理
    else{
        cout<<fastpower(a,p)<<" "<<a<<" "<<fastpower(a,p-1)<<" "<<1<<endl;//输出两个等余数序列
    }
    return 0;
}
// 思路:题目描述得很清楚,所以我们直接利用费马两条小定理,
// 再加上质数的判断即可,这里注意一定要融合快速幂,不然很容易超时

总结着来说,题出得不算太烂,快速幂占主要部分! 

 这就是今天一个有感而发博客的全部内容了,虽然很烂,但是喜欢就关注一下吧……

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值