2017.5.27测试 5. 扑克游戏

来源:互联网 发布:led蓝光危害 知乎 编辑:程序博客网 时间:2024/05/23 21:29

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.

原创粉丝点击