快速幂的应用(简单的数学题)
对快速幂的介绍,推荐大家去看大佬的讲解(如下)
快速幂算法(全网最详细地带你从零开始一步一步优化)
https://blog.csdn.net/qq_19782019/article/details/85621386
描述
“我读了,一发A了,有什么好说的。”“你个彩笔。”机房又传来FT训斥Codeoos的声音。美丽的女孩Codeoos对此感到很委屈。原来,Codeoos遇到一道数学题,她做不出来。但是厉害的FT一眼就秒了!这道数学题是这样的:
输入格式
第一行一个数T(1≤T≤100),表示数据组数。
接下来T行,每行一个数n(1≤n≤1e18)。
输出格式
输出T行,每行一个数表示F(n)对996251取模之后的值。
输入样例
输出样例
代码与注释如下:
#include<bits/stdc++.h>
using namespace std;
//1^n*2^(n-1)*3^(n-2)*.....(n-1)^2*n
//使用快速幂
//取模公式 (a*b)%p=(a%p*b%p)%p
long long fast(long long base,long long power,int a){
long long result=1;
while(power>0){
if(power%2==1){
power--;
result=result*base%a;
}
power=power/2;
base=base*base%a;
}
return result;
}
//注意long long 才够用
int main(){
int n;
cin>>n;
long long m;
long long w;
long long sum;
int a=996251;
while(n--){
cin>>m;
sum=1;
w=m;
//注意当输入的数大于996251,
//那么它的展开式中一定会有996251%996251==0的情况,
//任何数乘以0都等于0,
//所以大于996251的数的结果都为0
if(m<a){ //判断m是否大于996251
for(long long i=1;i<=m;i++){
sum=sum*fast(i,w,a)%a;
w--;
}
}else{
sum=0; // 所以大于996251的数的结果都为0
}
cout<<sum<<endl;
}
return 0;
}