[ACM] SDUT 2883 Hearthstone II (第二类Stiring数)

Hearthstone II

Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

The new season has begun, you have n competitions and m well prepared decks during the new season. Each competition you could use any deck you want, but each of the decks must be used at least once. Now you wonder how many
ways are there to plan the season — to decide for each competition which deck you are going to used. The number can be very huge, mod it with 10^9 + 7.

输入

The input ?le contains several test cases, one line for each case contains two integer numbers n and m (1?≤?m?≤?n?≤?100).

输出

One line for each case, output one number — the number of ways.

示例输入

3 2
100 25

示例输出

6
354076161

提示

来源

2014年山东省第五届ACM大学生程序设计竞赛

解题思路:

题意为n个竞赛要用到m张桌子,每张桌子至少被用一次,桌子不同,问一共有多少种安排方法。

也就是把n个元素分到m个非空且不可区分的集合中去。第二类Stiring数   s(n,m)意思是把n个元素分到m个非空且不可区分的集合中去。本题集合(桌子)是可区分的,那么答案为

m! *s(n,m).

知识详解见:http://blog.csdn.net/sr_19930829/article/details/40888349

代码:

#include <iostream>
#include <string.h>
using namespace std;
const int maxn=102;
const int mod=1e9+7;
typedef long long ll;
ll s[maxn][maxn];
int n, m;  

void init()
{
    memset(s,0,sizeof(s));
    s[1][1]=1;
    for(int i=2;i<=100;i++)
        for(int j=1;j<=i;j++)
            {
                s[i][j]=s[i-1][j-1]+j*s[i-1][j];
                if(s[i][j]>=mod)
                    s[i][j]%=mod;
            }
}  

ll solve(int n,int m)
{
    ll ans=s[n][m];
    for(int i=2;i<=m;i++)
    {
        ans*=i;
        if(ans>=mod)
            ans%=mod;
    }
    return ans;
}  

int main()
{
    init();
    while(cin>>n>>m)
    {
        cout<<solve(n,m)<<endl;
    }
    return 0;
}
时间: 2024-09-30 14:45:30

[ACM] SDUT 2883 Hearthstone II (第二类Stiring数)的相关文章

[组合数学] 第一类,第二类Stirling数,Bell数

一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数. 证明:元素在拿些盒子并不重要,唯一重要的是各个盒子里装的是什么,而不管哪个盒子装了什么. 递推公式有:S(p,p)=1 (p>=0)         S(p,0)=0  (p>=1)         S(p,k)=k*S(p-1,k)+S(p-1,k-1)   (1<=k<=p-1) .考虑将前p个正整数,1,2,.....p的集合作为要被

ACM: A + B Problem II (两个大整数相加)

Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX 1000 //给数组赋值 void arrV(int a[],int len,int p){ int i; for(i=0;i<len;i++){ a[i]=p; } } //打印数组中的运算结果 void printRverse(int a[]){ int len=0,i=0; while(a[i]!=-1){

KMP(http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&amp;problemid=2772)

#include <stdio.h>#include <string.h>#include <stdlib.h>char a[1000001],b[1000001];int next[1000001];int l,l2;void Getnext(){ int i=0; int j=-1; next[0]=-1; while(i<l2) { if(-1==j||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j];

[ACM] FZU 1570 集合划分问题( 不同小球放入相同盒子,第二类Stirling数)

Problem Description n个元素的集合{1,2,...,n}可以划分若干个非空子集.例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集如下: {{1},{2},{3},{4}}, {{1,2},{3},{4}}, {{1,3},{2},{4}}, {{1,4},{2},{3}}, {{2,3},{1},{4}}, {{2,4},{1},{3}}, {{3,4},{1},{2}}, {{1,2},{3,4}}, {{1,3},{2,4}}, {{1,4},{2,

HDU 2643 Rank:第二类Stirling数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2643 题意: 有n个个选手参赛,问排名有多少种情况(可以并列). 题解: 简化问题: 将n个不同的元素放到i个有差别的盒子中,情况数为P(n,i),求∑P(n,i) (1<=i<=n) 再简化: 将n个不同的元素放到i个无差别的盒子中,情况数为S(n,i),求∑( S(n,i)*i! ) (1<=i<=n) 哇这是第二类Stirling数 ( ̄▽ ̄)~* 递推式:s(n,k) = s(

HDU 4045 Machine scheduling --第二类Strling数

题意: n个数(1~n)取出r个数,取出的数相差要>=k, 然后分成m个可空组,问有多少种情况. 解法: 先看从n个数中取r个相差>=k的数的方法数,可以发现 dp[i][j] = dp[1][j-1] + dp[2][j-1] + ... + dp[i-k][j-1],(dp[i][1] = i)  即维护一个前缀和即可,可以在O(r*n)内得出. 然后n个不同的数分成m个可以空的组,即为第二类Strling数的和 : S[n][1] + S[n][2] + ... + S[n][m]. S

poj 1671 Rhyme Schemes 第二类Stirling数

题意: 求s(n,0)+s(n,1)+...s(n,n),s(i,j)为第二类Stirling数. 分析: 有递推公式s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1. 代码: //poj 1671 //sep9 #include<iostream> using namespace std; double s[64][64]; double sum[64]; int main() { for(int i=0;i<=50;++i){ s[i

第二类Stirling数初探 By cellur925

上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq. 在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验,逃.) 一.什么是第二类Stirling数 第二类斯特林数 S(n,k):把 n 个元素划分成 k 个集合的方案数.  这个问题说的实际一点,就比如说,有n个互异的小球,把他们放入m个盒子里,盒子里不允许为空的方案数.我们设s(i,j)表示放到i个小球,j个盒子的方案数. 那么对于每个小球,当前我们有两种

杭电OJ第十五届ACM第一题 Hearthstone

Problem Description   Cdfpysw loves playing a card game called "Hearthstone".   Now he has N cards, he wants to split these cards into 4 piles. Let's assume the number of cards in each pile is a1, a2, a3, a4.   It must be satisfied that:     a1