1. 程式人生 > >A-最大乘積 (遞推公式+找規律)

A-最大乘積 (遞推公式+找規律)

時間限制: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;
}