干了这桶冰红茶!(组合数学)

来源:互联网 发布:n卡游戏优化软件 编辑:程序博客网 时间:2024/06/02 12:52

E. 干了这桶冰红茶!

1000ms
1000ms
65536KB
64-bit integer IO format: %lld      Java class name: Main
Submit Status PID: 34058
Font Size:  

BNUCIST的HWQ大神特别钟爱冰红茶这种神棍的饮料,有一天打Dota暴虐他寝室的WL后,决定大喝一顿庆祝一下。他决定用一种神棍的方式来喝冰红茶,那就是每口只喝1升,或者2升,或者3升(PS:HWQ大神真的能喝这么多= =)。爱思考的HWQ突然想知道,对于一桶整数升的冰红茶,他可以有多少种方案喝光,但似乎他不能马上想出解决的办法,纠结的他不知道答案他就喝不下去了。聪明的你快帮帮他吧。

Input

    输入一个整数T,代表数据组数。

    对于每一组数据,输入一个整数N,1<=N<=30,表示这桶冰红茶有N升。

Output

对于每个N,输出一个整数,代表方案数。

Sample Input

13

Sample Output

4

Hint

对于样例,3升的冰红茶,他可以(1)每次喝1升,连喝3口;(2)第一口喝1升,第二口喝2升;(3)第一口喝2升,第二口喝1升;(4)一口就喝掉3升。所以共有4种方案。



代码:

#include <stdio.h>
#include <string.h>

int C(int n, int k)
{
    int i, ret = 1;
    for(i = 1; i <= n - k; ++i)
    {
        ret *= k + i;
        ret /= i;
    }
    return ret;
}//组合函数


int main()
{
    int t, n, i, j, k, s, d, r;
    int line[35];
    memset(line, -1, sizeof(line));
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        if(line[n] != -1)
        {
            printf("%d\n", line[n]);
            continue;
        }
        s = 0;
        for(i = 0; i <= n; ++i)
        {
            for(j = 0; j <= n; ++j)
            {
                for(k = 0; k <= n; ++k)
                {
                    d = i + 2 * j + 3 * k;
                    if(d > n) break;
                    if(d == n)
                    {
                        r =
C(i + j + k, i) * C(j + k, j) * C(k, k);
                        s += r;
                    }
                }
            }
        }
        line[n] = s;
        printf("%d\n", line[n]);
    }
    return 0;
}



0 0