5. 扑克游戏
(e.pas/cpp/c)
【题目描述】
都知道,一副扑克里有四种花色(梅花、黑桃、方块、红桃)。
假设每两张同花色的牌组成一组,求当手上有N张牌时,至少组成1到N/2(向下取整)组牌时有多少种不同的方案?
例如:手中可有N张牌,可以构成:
|
梅花 |
黑桃 |
方块 |
红桃 |
|
a张 |
b张 |
c张 |
d张 |
|
a+b+c+d=N,其中0<=a,b,c,d<=n | |||
即:求上表格中所有不同方案能组成1到N/2组的方案数。
例如n=5时,只能构成1组、2组,不能构成3组;构成举例如下:
|
梅花 |
黑桃 |
方块 |
红桃 |
构成方案说明 |
|
1张 |
2张 |
2张 |
0张 |
黑桃或方块可构成1组,没有能构成2组的花色 |
|
2张 |
2张 |
0张 |
1张 |
梅花或黑桃可构成1组,没有能构成2组的花色 |
|
4张 |
0张 |
1张 |
0张 |
梅花可构成1组,梅花也能构成2组 |
|
0张 |
5张 |
0张 |
0张 |
黑桃有5张可构成1组,也能构成2组,但不能构成3组 |
|
……………… |
……………… | |||
由于最后答案可能会很大,请输出答案 mod 10007的结果。
【输入格式】
一个数,N。
【输出格式】
共N/2(向下取整)行,第i行表示至少组成i组牌时有多少种不同的方案。
【输入样例1】
3
【输出样例1】
16
【样例解释1】
以下列举当手中有3张牌时,每种花色的张数,可能有以下16种情况:
梅花 黑桃 方块 红桃
0 0 0 3
0 0 1 2
0 0 2 1
0 0 3 0
0 1 0 2
0 1 2 0
0 2 0 1
0 2 1 0
0 3 0 0
1 0 0 2
1 0 2 0
1 2 0 0
2 0 0 1
2 0 1 0
2 1 0 0
3 0 0 0
【输入样例2】
4
【输出样例2】
34
10
【数据范围】
30%N<=1000
100%N<=10000
var
h:array[0..4]of longint;
a:array[0..10000]of longint;
n,i,j,k,l,t,ans:longint;
begin
readln(n);
for i:=0 to n do
for j:=0 to n-i do
begin
k:=n-i-j;
t:=(i div 2)+(j div 2)+(k div 2);
if k mod 2=1 then a[t]:=(a[t]+k+1) mod 10007
else
begin
a[t]:=(a[t]+k div 2+1) mod 10007;
a[t-1]:=(a[t-1]+k div 2)mod 10007;
end;
end;
for i:=n div 2 downto 2 do a[i-1]:=(a[i-1]+a[i]) mod 10007;
for i:=1 to n div 2 do writeln(a[i]);
end.
探讨了在给定数量的扑克牌中,如何计算不同花色的牌可以组成的特定数量的组别方案总数。通过数学组合的方法,解决了对于任意数量的牌能够构成的不同组合数量的问题。
1920

被折叠的 条评论
为什么被折叠?



