资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
将一个数N分为多个正整数之和,即N=a1+a2+a3+…+ak,定义M=a1*a2*a3*…*ak为N的潜能。
给定N,求它的潜能M。
由于M可能过大,只需求M对5218取模的余数。
输入格式
输入共一行,为一个正整数N。
输出格式
输出共一行,为N的潜能M对5218取模的余数。
样例输入
10
样例输出
36
数据规模和约定
1<=N<10^18
#include<iostream>
using namespace std;
int qmi(int m,long long k,int q=5218){
int res=1;
while(k){
if(k&1){
res=res*m%q;
}
m=m*m%q;
k>>=1;
}
return res;
}
int main(){
long long n;
scanf("%lld",&n);
if(n==1){
printf("1\n");
}else{
//规律:只有2或为3时乘积最大(3越多越好)
if(n%3==0){
//3^(n/3)
printf("%d\n",qmi(3,n/3));
}else if(n%3==1){
//3^((n-4)/3) *2*2
printf("%d\n",qmi(3,(n-4)/3)*4%5218);
}else if(n%3==2){
//3^((n-2)/3) *2
printf("%d\n",qmi(3,(n-2)/3)*2%5218);
}
}
return 0;
}
思路:先找到规律,再利用快速幂高效求解。
注意:指数k的范围。