版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83109854
Description
这题要你回答 个询问,给你一个正整数 ,若有若干个正整数的和为 ,则这若干的数的乘积最大是多少?请输出答案除以 (共有 个零) 的余数。
Input
输入的第一行有一个正整数
,代表该测试数据含有多少组询问。
接下来有$T $行,每个询问各占
行,包含$ 1$ 个正整数,代表该询问的
值。
Output
对于每个询问,请输出答案除以 (共有 个零) 的余数。
Sample Input
10
1
2
3
4
5
6
7
8
9
100
Sample Output
1
2
3
4
6
9
12
18
27
7412080755407364
Solution
数学归纳法可以证明把
拆成尽可能多的
以及不超过两个
的组合是最优解,此时有
Code
#include<cstdio>
using namespace std;
typedef long long ll;
ll mod=2000000000000000003ll;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ll ans=1;
if(n%3==0)
{
n/=3;
for(int i=1;i<=n;i++)ans=3ll*ans%mod;
}
else if(n%3==1)
{
if(n>1)
{
ans=4;
n=(n-4)/3;
for(int i=1;i<=n;i++)ans=3ll*ans%mod;
}
}
else
{
ans=2;
n=(n-2)/3;
for(int i=1;i<=n;i++)ans=3ll*ans%mod;
}
printf("%lld\n",ans);
}
return 0;
}