快速幂的应用(简单的数学题)

快速幂的应用(简单的数学题)

对快速幂的介绍,推荐大家去看大佬的讲解(如下)
快速幂算法(全网最详细地带你从零开始一步一步优化)
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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值