问题 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;
}