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.