A-最大乘積 (遞推公式+找規律)
阿新 • • 發佈:2019-01-26
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
這題要你回答T個詢問,給你一個正整數S,若有若干個正整數的和為S,則這若干的數的乘積最大是多少?請輸出答案除以2000000000000000003(共有17 個零) 的餘數。
舉例來說,當 S = 5 時,若干個數的和為 5 的情形有以下 7 種(不考慮數字的順序的話):
1. 1 + 1 + 1 + 1 + 1
2. 1 + 1 + 1 + 2
3. 1 + 1 + 3
4. 1 + 2 + 2
5. 1 + 4
6. 2 + 3
7. 5
他們的乘積依序為:
1. 1 * 1 * 1 * 1 * 1 = 1
2. 1 * 1 * 1 * 2 = 2
3. 1 * 1 * 3 = 3
4. 1 * 2 * 2 = 4
5. 1 * 4 = 4
6. 2 * 3 = 6
7. 5 = 5
其中乘積最大的是 2 * 3 = 6。
輸入描述:
輸入的第一行有一個正整數 T,代表該測試資料含有多少組詢問。
接下來有 T 行,每個詢問各佔 1 行,包含 1 個正整數,代表該詢問的 S 值。
輸出描述:
對於每個詢問,請輸出答案除以 2000000000000000003(共有17個零) 的餘數。
示例1
輸入
複製
10
1
2
3
4
5
6
7
8
9
100
輸出
複製
1
2
3
4
6
9
12
18
27
7412080755407364
備註:
1 ≤ T ≤ 100
1 ≤ S ≤ 2000
(簽到題)這題測試樣例給的真的多,從中可以發現是有規律,細心找就是了!!!
#include<bits/stdc++.h> using namespace std; #define mod 2000000000000000003 long long f[2006]; int main() { for(int i=1;i<=4;i++) f[i]=i; for(int i=5;i<=2005;i++) { f[i]=3*f[i-3]; f[i]=f[i]%mod; } int t,s; scanf("%d",&t); while(t--) { scanf("%d",&s); printf("%lld\n",f[s]); } return 0; }