资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
将一个数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
算法学习笔记(4):快速幂 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/95902286
知识点:大数求模
思路:这道题并没有明确给出怎么把N分解为多个数相加的,但是我们看样例中输入10,输出36.而36=4*9,所以就可以想到10=2+2+3+3.
如果把任意数都分解为多个2和3相加,并且令3尽可能的多,怎么确定有多少个2和多少个3呢?
取任意数X(X>2),令a=X%3,则a的结果只能是0,1,2.
如果a=0,则表示X是由X/3个3相加构成的,即X=3*(X/3);
如果a=1,则表示X是由X/3-1个3和两个2构成的,即X=3*(X/3-1)+4;
如果a=2,则表示X是由X/3个3和一个2构成的,即X=3*(X/3)+2;
#include<iostream>
using namespace std;
const int x = 5218;
long long qpow(long long n, long long a) {
if (n == 0)
return 1;
else if (n % 2 == 1)
return qpow(n - 1, a) * a % x;
else {
long long temp = qpow(n / 2, a) % x;
return temp * temp % x;
}
}
int main() {
long long N;
cin >> N;
long long threeCount = 0;
long long ans;
if (N < 3) {
cout << N << endl;
return 0;
}
if (N % 3 == 0)
threeCount = N / 3, ans = qpow(threeCount, 3) % x;
if (N % 3 == 1)
threeCount = N / 3 - 1, ans = qpow(threeCount, 3) * 4 % x;
if (N % 3 == 2)
threeCount = N / 3, ans = qpow(threeCount, 3) * 2 % x;
cout << ans << endl;
return 0;
}