zoukankan      html  css  js  c++  java
  • lightoj1326_第二类Stirling

    题目链接http://lightoj.com/volume_showproblem.php?problem=1326

    1051 - Good or Bad
    Time Limit: 2 second(s) Memory Limit: 32 MB

    A string is called bad if it has 3 vowels in a row, or 5 consonants in a row, or both. A string is called good if it is not bad. You are given a string s, consisting of uppercase letters ('A'-'Z') and question marks ('?'). Return "BAD" if the string is definitely bad (that means you cannot substitute letters for question marks so that the string becomes good), "GOOD" if the string is definitely good, and "MIXED" if it can be either bad or good.

    The letters 'A', 'E', 'I', 'O', 'U' are vowels, and all others are consonants.

    Input

    Input starts with an integer T (≤ 200), denoting the number of test cases.

    Each case begins with a non-empty string with length no more than 50.

    Output

    For each case of input you have to print the case number and the result according to the description.

    Sample Input

    Output for Sample Input

    5

    FFFF?EE

    HELLOWORLD

    ABCDEFGHIJKLMNOPQRSTUVWXYZ

    HELLO?ORLD

    AAA

    Case 1: BAD

    Case 2: GOOD

    Case 3: BAD

    Case 4: MIXED

    Case 5: BAD

    第一类Stirling数 s(p,k)

        

    s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数。

    s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1

    边界条件:s(p,0)=0 ,p>=1  s(p,p)=1  ,p>=0

     

    递推关系的说明:

    考虑第p个物品,p可以单独构成一个非空循环排列,这样前p-1种物品构成k-1个非空循环排列,方法数为s(p-1,k-1);

    也可以前p-1种物品构成k个非空循环排列,而第p个物品插入第i个物品的左边,这有(p-1)*s(p-1,k)种方法。

     

    第二类Stirling数 S(p,k)

       

    S(p,k)的一个组合学解释是:将p个物体划分成k个非空的不可辨别的(可以理解为盒子没有编号)集合的方法数。

    k!S(p,k)是把p个人分进k间有差别(如:被标有房号)的房间(无空房)的方法数。

       

    S(p,k)的递推公式是:S(p,k)=k*S(p-1,k)+S(p-1,k-1) ,1<= k<=p-1

    边界条件:S(p,p)=1 ,p>=0    S(p,0)=0 ,p>=1

      

    递推关系的说明:

    考虑第p个物品,p可以单独构成一个非空集合,此时前p-1个物品构成k-1个非空的不可辨别的集合,方法数为S(p-1,k-1);

    可以前p-1种物品构成k个非空的不可辨别的集合,第p个物品放入任意一个中,这样有k*S(p-1,k)种方法。

      

    第一类斯特林数和第二类斯特林数有相同的初始条件,但递推关系不同。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <ctime>
     8 #include <queue>
     9 #include <list>
    10 #include <set>
    11 #include <map>
    12 using namespace std;
    13 #define INF 0x3f3f3f3f
    14 typedef long long LL;
    15 
    16 const int mod = 10056;
    17 LL res[1010][1010], ans[1010][1010], x[1010], y[1010];
    18 void init()
    19 {
    20     x[1] = 1;
    21     for(int i = 2; i <= 1000; i++)
    22         x[i] = (x[i-1] * i) % mod;
    23     memset(res, 0, sizeof(res));
    24     res[1][1] = 1, y[1] = 1;
    25     for(int i = 2; i <= 1000; i++)
    26     {
    27         for(int j = 1; j <= i; j++)
    28         {
    29             res[i][j] = (j*res[i-1][j]%mod + res[i-1][j-1])%mod;
    30             ans[i][j] = (res[i][j] * x[j]) % mod;
    31             y[i] = (y[i]+ans[i][j]) % mod;
    32         }
    33     }
    34 }
    35 int main()
    36 {
    37     int t, n;
    38     init();
    39     scanf("%d", &t);
    40     for(int ca = 1; ca <= t; ca++)
    41     {
    42         scanf("%d", &n);
    43         printf("Case %d: %lld
    ", ca, (y[n]+mod)%mod);
    44     }
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    Coding.net进阶,使用Git管理代码
    经典算法问题
    浅谈三款常用软件
    Coding.net简单使用指南
    湖北宜化总结
    天顺风能经验总结
    Vue中watch的高级用法
    html 锚点三种实现方法
    【机器学习】EM算法详细推导和讲解
    【机器学习】BP神经网络实现手写数字识别
  • 原文地址:https://www.cnblogs.com/luomi/p/5954610.html
Copyright © 2011-2022 走看看