zoukankan      html  css  js  c++  java
  • [组合数学]Magic 12 Months(坑)

    Magic 12 Months

    Description

    去掉一副扑克牌的大小王和四张K,把剩下的48张牌分成12摞,每摞四张,之后按如下步骤操作:

    1.令p=1

    2.把第p摞牌最上面一张翻开扔掉,p变成这张牌的点数

    3.如果第p摞牌被拿完则结束,否则继续第2步

    现在给出前n张被翻开扔掉的牌,问游戏结束时,每种牌全部被拿完的概率

    Input

    第一行一整数TT表示用例组数,每组用例首先输入一整数nn表示已经被翻开扔掉的牌数,之后输入这nn张牌,保证合法(0n48)

    output

    输出1212个最简分数表示游戏结束时每种牌全部被拿完的概率,概率为00或11时直接输出00或1

    Examples

    Input


    30 9 Q 10 J Q 10 J 10 J J 8 5 7 6 5 7 6 7 6 6 3 A 2 4 A 2 4 2 4 4 

    7 2 A 3 A 4 A A

    Output

    1 2/3 2/5 1 1/2 1 2/3 2/5 2/5 2/3 1 1/2 
    1 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 
    1 0 0 0 0 0 0 0 0 0 0 0

    正确解法:

    看不懂题目QAQ

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<vector>
     7 #include<queue>
     8 #include<map>
     9 #include<set>
    10 #include<ctime>
    11 using namespace std;
    12 typedef long long ll;
    13 typedef pair<int,int>P;
    14 const int INF=0x3f3f3f3f,maxn=15;
    15 int T,n,num[maxn];
    16 ll C(int n,int m)
    17 {
    18     if(m<0||m>n)return 0;
    19     ll ans=1;
    20     for(int i=1;i<=m;i++)ans=ans*(n-m+i)/i;
    21     return ans;
    22 }
    23 int V(char *s)
    24 {
    25     if(s[1])return 10;
    26     if(s[0]=='A')return 1;
    27     if(s[0]=='J')return 11;
    28     if(s[0]=='Q')return 12;
    29     return s[0]-'0';
    30 }
    31 ll gcd(ll a,ll b)
    32 {
    33     return b?gcd(b,a%b):a;
    34 }
    35 int main()
    36 {
    37     scanf("%d",&T);
    38     while(T--)
    39     {
    40         scanf("%d",&n);
    41         for(int i=1;i<=12;i++)num[i]=4;
    42         for(int i=1;i<=n;i++)
    43         {
    44             char s[3];
    45             scanf("%s",s);
    46             num[V(s)]--;
    47         } 
    48         n=48-n;
    49         printf("1");
    50         for(int i=2;i<=12;i++)
    51             if(!num[i])printf(" 1");
    52             else if(!num[1])printf(" 0");
    53             else
    54             {
    55                 ll q=C(n,num[1])*C(n-num[1],num[i]);
    56                 ll p=0;
    57                 for(int j=num[1]+num[i];j<=n;j++)p+=C(j-1,num[1]-1)*C(j-num[1],num[i]);
    58                 ll g=gcd(p,q);
    59                 p/=g,q/=g;
    60                 if(p==0)printf(" 0");
    61                 else if(p==q)printf(" 1");
    62                 printf(" %lld/%lld",p,q);
    63             }
    64         printf("
    ");
    65     }
    66     return 0;
    67 }
    View Code

    ---------------------
    作者:v5zsq
    来源:CSDN
    原文:https://blog.csdn.net/V5ZSQ/article/details/80205105
    版权声明:本文为博主原创文章,转载请附上博文链接!

    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    WPF关于改变ListBoxItem的颜色的注意事项以及如何找到ListBox中的ItemsPanel
    WPF中关于配置文件的读取
    C++虚函数和虚函数表
    gdb调试技巧
    libevent和基于libevent的网络编程
    Reactor模式详解
    Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法
    Linux进程间通信——使用共享内存
    Linux进程间通信——使用信号量
    布隆过滤器(Bloom Filter)详解
  • 原文地址:https://www.cnblogs.com/Kaike/p/10661663.html
Copyright © 2011-2022 走看看