【Stirling Number I】

hdu 4372 Count the Buildings

推荐这位小哥的,我觉得人家说的灰常的好。

注意数据范围,n,f,b均在(0,2000]范围内,而第一斯特林数的数组范围却是s[2000+5][2000+5]的(你要是开4000会内存超限),所以要加一个对(f+b-2)的判断,否则C++过不了,G++是能过的。亲身实践,虽然不知道G++为什么这么鲁棒...

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long ll;
 8 const ll MOD = 1000000007;
 9 const int maxn = 2005;
10 ll s[maxn][maxn];
11 ll C[maxn][maxn];
12
13 void get_Combination_Number()
14 {
15     for(int i = 1; i <= 2000; i++)
16     {
17         C[i][0] = C[i][i] = 1;
18         for(int j = 1; j < i; j++)
19             C[i][j] = (C[i-1][j-1]+C[i-1][j])%MOD;
20     }
21 }
22
23 void get_Stirling_Number_I()
24 {
25     s[0][0] = 1;
26     for(int i = 1; i <= 2000; i++)
27     {
28         s[i][0] = 0;
29         s[i][i] = 1;
30         for(int j = 1; j < i; j++)
31         {
32             s[i][j] = (s[i-1][j-1] + (i-1)*s[i-1][j]) % MOD;
33         }
34     }
35 }
36
37 int main()
38 {
39     get_Combination_Number();
40     get_Stirling_Number_I();
41     int T;
42     scanf("%d", &T);
43     while(T--)
44     {
45         int n, f, b;
46         scanf("%d%d%d", &n, &f, &b);
47         ll ans = 0;
48         if(f+b-2 <= n-1)
49             ans = (s[n-1][f+b-2] * C[f+b-2][f-1]) % MOD;
50         else
51             ans = 0;
52         printf("%lld\n", ans);
53     }
54     return 0;
55 }

hdu 4372

时间: 2024-11-07 00:54:57

【Stirling Number I】的相关文章

【Stirling Number】

两类Stirling Number的简介与区别(参考自ACdreamer的CSDN) Stirling Number I --- s(n,k):将n个物体排成k个非空循环排列(环)的方法数. 递推式:s(n, k) = (n-1)*s(n-1, k) + s(n-1, k-1); 1<= k<n 解释:考虑第n+1个元素1.单独形成循环排列,剩下的有s(n-1, k-1)种方法         2.和别的元素一起形成循环排列,n-1个元素形成k个循环排列的方法数是s(n-1,k),插入时共有n

【Java学习系列】第2课--Java语法及面向对象

本文地址 分享提纲: 1. Java程序特点 1.1 基本语法 1.2 字符创 1.3 变量 1.4 Java数组 1.5 Java枚举 1.6 Java修饰符 2. Java面向对象 2.1 Java类和对象 2.2 类的一些注意点 2.3 Java Number类 3.参考文档 本文主要介绍下Java程序的特点(不同于PHP的地方)和面向对象的一些特点 1. Java程序特点 [示例代码] 1 public class HelloWorld { 2 /* 第一个Java程序 3 * 它将打印

hdoj 1492 The number of divisors(约数) about Humble Numbers 【数论】【质因子分解 求和】

定理:一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的个数就是,(r1+1)*(r2+1)*...*(rk+1). 理解:为什么是加1之后再相乘,因为一个数的的因子数至少为1和他自身,但因为r1,r2..可以为0,所以因子的个数为(r1+1)... 拓展一下: 定理1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的

【LeetCode-面试算法经典-Java实现】【009-Palindrome Number(回文数)】

[009-Palindrome Number(回文数)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Determine whether an integer is a palindrome. Do this without extra space. 题目大意 判断一个数字是否是回访字数,不要使用额外的空间. 解题思路 为了不使用额外的空间,参考了其它的解决,那些解法看起来在isPalindrome方法中没有使用额外参数,但是却使用了方法调用,这个比一个整数消耗的

【LeetCode-面试算法经典-Java实现】【136-Single Number(只出现一次的数字)】

[136-Single Number(只出现一次的数字)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it wit

【LeetCode-面试算法经典-Java实现】【137-Single Number II(只字出一次的数字II)】

[137-Single Number II(只出现一次的数字II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you imple

【Leetcode长征系列】Letter Combinations of a Phone Number

原题: Given a digit string, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given below. Input:Digit string "23" Output: ["ad", "ae"

【LeetCode-面试算法经典-Java实现】【202-Happy Number(开心数字)】

[202-Happy Number(开心数字)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Write an algorithm to determine if a number is "happy". A happy number is a number defined by the following process: Starting with any positive

【Leetcode长征系列】Single Number II

原题: Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 思路: 用一个32位的数组存每一位bit值之后.得到答案后每一位除