[BZOJ2425][HAOI2010]计数(组合数学)
来源:互联网 发布:本地pubmed数据库 编辑:程序博客网 时间:2024/06/07 00:38
首先,统计出数字串中
先考虑用其中的所有非零数字能构成多少个允许含前导
可以想到,现在
而对于不含前导
代码实现如下(
ll lowe(int len, bool first) { int i, j; ll ans = 1; if (!first) { for (i = 1; i <= 9; len -= cnt[i++]) ans *= C[len][cnt[i]]; return ans; } ans = 0; for (i = 1; i <= 9; i++) { cnt[i]--; ans += lowe(len - 1, 0); cnt[i]++; } return ans;}
继续考虑求位数相等且比原数字串小的数字串个数。
考虑最高位的取值,分两部分计算:
1、最高位的取值比原数字串的最高位小。这样后面位的值不管取多少,都是不会大于等于原数字串的。这时候可以用上面的方法求得。
2、最高位的取值等于原数字串的最高位。这时候就要求去掉最高位之后比原数字串小。但可以发现,这是和原问题相同的一个子问题,可以递归处理(在标程中使用的是非递归)。
注意判断前导
组合数可以使用公式
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N = 1005, R = 12;int n, num[N], tot, cnt[R];char s[N]; ll C[N][N], Ans;void init() { int i, j; for (i = 0; i <= 1000; i++) C[i][0] = 1; for (i = 1; i <= 1000; i++) for (j = 1; j <= i; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1];}ll lowe(int len, bool first) { int i, j; ll ans = 1; if (!first) { for (i = 1; i <= 9; len -= cnt[i++]) ans *= C[len][cnt[i]]; return ans; } ans = 0; for (i = 1; i <= 9; i++) { cnt[i]--; ans += lowe(len - 1, 0); cnt[i]++; } return ans;}void solve() { int i, j; for (i = 1; i <= n; i++) { for (j = (i == 1); j < num[i]; j++) { if (!cnt[j]) continue; cnt[j]--; Ans += lowe(n - i, 0); cnt[j]++; } cnt[num[i]]--; }}int main() { int i; scanf("%s", s + 1); n = strlen(s + 1); for (i = 1; i <= n; i++) { cnt[num[i] = s[i] - '0']++; if (num[i]) tot++; } init(); for (i = tot; i < n; i++) Ans += lowe(i, 1); cout << (solve(), Ans) << endl; return 0;}
阅读全文
0 0
- [BZOJ2425][HAOI2010]计数(组合数学)
- 【bzoj2425】【HAOI2010】【计数】【组合数学】
- bzoj2425 [HAOI2010]计数 组合数
- BZOJ2425 [HAOI2010]计数
- BZOJ2425: [HAOI2010]计数
- HAOI2010 计数
- 组合数学计数问题(谷歌)
- poj3064(组合数学计数Dp)
- [bzoj4517][Sdoi2016]排列计数(组合数学)
- 组合数学-基本计数
- 组合数学中的项链计数
- 2425: [HAOI2010]计数
- luogu P2518 [HAOI2010]计数
- BZOJ 2111: [ZJOI2010]Perm 排列计数(简单组合数学)
- 第二章:数学基础(组合计数+递推)
- UVA 10601 Cubes (组合数学 + ploya计数)
- [HNOI2004]树的计数(prufer编码+组合数学)
- [BZOJ2111][ZJOI2010]Perm 排列计数(组合数学+lucas定理)
- 1.netty基本概念
- C# lambda和Linq
- 从现在开始,每周坚持一个java知识点
- Codeforces Round #442 (Div. 2) 题解(877A~F)
- install kinnect senor on ubuntu
- [BZOJ2425][HAOI2010]计数(组合数学)
- ACM中国国家集训队论文集目录(1999-2009)
- Java中getResourceAsStream的用法
- JPEG 推荐的DC和AC系数的huffman(哈夫曼)码表
- 洛谷P1747 好奇怪的游戏(真的很奇怪哦~)
- 矩阵第二节
- 我的c语言自学之路
- Deque容器
- 迭代器模式