{注明:这并不是一个很详细的教程,而是我有感而发随便写的}
众所周知,费马小定理是数论里的一个小小却很难(应用)的定理,有两个公式如下:
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;
}
// 思路:题目描述得很清楚,所以我们直接利用费马两条小定理,
// 再加上质数的判断即可,这里注意一定要融合快速幂,不然很容易超时
总结着来说,题出得不算太烂,快速幂占主要部分!
这就是今天一个有感而发博客的全部内容了,虽然很烂,但是喜欢就关注一下吧……