Newcoder 110 A.最大乘積(數論)
阿新 • • 發佈:2018-11-09
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;
}