蓝桥杯算法训练 数的潜能 C++

资源限制

时间限制: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)icon-default.png?t=M276https://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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值