[组合数递推公式] RGB游戏 ZUFE2019校赛D

问题 D: D - RGB游戏

时间限制: 1 Sec  内存限制: 256 MB
提交: 35  解决: 6
[提交][状态][讨论版]

题目描述

三水最近发明了一个RGB游戏:有 n 个方格,编号为从 1 到 n,它用七种颜色的颜料给方格上色,每个 方块只能涂一种颜色。总的分值是这 n 个方块得分之和,如果方块被涂成红色,则方块的得分为 2,如 果方块被涂成蓝色则为 3,如果方块被涂成紫色则为 5,如果方块被涂成黄色则为 7,如果方块被涂成橙 色则为 9,如果方块被涂成绿色则为 10,如果方块被涂成黑色则为 12,如果方块没涂色,则得分为0。 想求这 n 个方块总得分为 K 时,能有多少种方案来上色,方案数对 1000000007 取模。

输入

第一行输入一个整数 T,表示接下来有 T 组测试数据

每组测试数据有一行

第一行有n,K两个整数,表示n个方块,总得分K

• 1 ≤ T ≤ 10.

• 1 ≤ n ≤ 3000.

• 1 ≤ K ≤ 30000.

 

输出

输出方案数

样例输入

1
2 10

样例输出

5

提示

样例解释:



方案一:两个方格都涂紫色 方案二:方格1涂蓝色,方格2涂黄色 方案三:方格1涂黄色,方格2涂蓝色 方案四:方格1涂绿色,方格2不涂 方案五:方格1不涂,方格2涂绿色

 

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll mod = 1000000007;

ll c[3010][3010];
void zuheshu(int maxn)
{
    c[0][0] = 1;
    for (int i = 1; i <= maxn; i++)
    {
        c[i][0] = 1;
        for (int j = 1; j <= i; j++)
            c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
    }
}

int main()
{
    zuheshu(3000);
    
    int T;
    scanf("%d", &T);
    while (T--)
    {
        int n, K;
        scanf("%d %d", &n, &K);
        
        ll ans = 0;
        for (int i = 0; i <= n; i++)
        {
            for (int j = 0; j <= n; j++)
            {
                int temp = 2 * i + 3 * j;
                if (temp > K || (K - temp) % 7 != 0)
                    continue;
                int k = (K - temp) / 7;
                if (k > n)
                    continue;
                ans = (c[n][i] * c[n][j] % mod * c[n][k] % mod + ans) % mod;
                /// 2, 3, 7 分别任意选 i, j, k 个格子填入
            }
        }
        printf("%lld\n", ans);
    }
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值