Uva12034 (组合数取模)

题意:两匹马比赛有三种比赛结果,n匹马比赛的所有可能结果总数

解法:

设答案是f[n],则假设第一名有i个人,有C(n,i)种可能,接下来还有f(n-i)种可能性,因此答案为 ΣC(n,i)f(n-i)

另外这里给出两个求组合数的模板,卢卡斯定理的p是模数,并且要求是素数,第二个是递推式,适合于n<2000的情况

 1 #include<cstdio>
 2 using namespace std;
 3 const int maxn = 1e3;
 4 const int mod = 10056;
 5 typedef long long ll;
 6
 7 /*--------------------------卢卡斯定理取模-----------------------*/
 8 ll exp_mod(ll a, ll b, ll p) {
 9     ll res = 1;
10     while (b != 0) {
11         if (b & 1) res = (res * a) % p;
12         a = (a*a) % p;
13         b >>= 1;
14     }
15     return res;
16 }
17
18 ll Comb(ll a, ll b, ll p) {
19     if (a < b)   return 0;
20     if (a == b)  return 1;
21     if (b > a - b)   b = a - b;
22
23     ll ans = 1, ca = 1, cb = 1;
24     for (ll i = 0; i < b; ++i) {
25         ca = (ca * (a - i)) % p;
26         cb = (cb * (b - i)) % p;
27     }
28     ans = (ca*exp_mod(cb, p - 2, p)) % p;
29     return ans;
30 }
31 //Lucas定理对组合数取模
32 ll Lucas(int n, int m, int p) {
33     ll ans = 1;
34     while (n&&m&&ans) {
35         ans = (ans*Comb(n%p, m%p, p)) % p;
36         n /= p;
37         m /= p;
38     }
39     return ans;
40 }
41
42 /*----------------------组合数递推公式(适用n<2000)---------------------------*/
43 int C[maxn+10][maxn+10];
44 void Cal_C(int n) {
45     //传递的是一个二维的数组c
46     for (int i = 0; i <= n; i++){
47         C[i][0] = C[i][i] = 1;
48         for (int j = 1; j < i; j++)
49             C[i][j] = (C[i - 1][j - 1]%mod + C[i - 1][j]%mod)%mod;
50     }
51     return;
52 }
53 /*--------------------------------------------------------------------------*/
54
55 int f[maxn+11];
56 void generate() {
57     Cal_C(maxn);
58     f[0] = 1;
59     for (int i = 1; i <= maxn; i++) {
60         f[i] = 0;
61         for (int j = 1; j <= i; j++)
62             f[i] = (f[i] + C[i][j] * f[i - j]) % mod;
63     }
64     return;
65 }
66
67 int main() {
68     int T; scanf("%d", &T);
69     int kase = 1;
70     generate();
71     while (T--) {
72         int n; scanf("%d", &n);
73         printf("Case %d: %d\n", kase++, f[n]);
74     }
75     return 0;
76 }

原文地址:https://www.cnblogs.com/romaLzhih/p/9515151.html

时间: 2024-10-10 22:55:23

Uva12034 (组合数取模)的相关文章

组合数取模终极版

以前讲述过很多组合数取模问题,详见:http://blog.csdn.net/acdreamers/article/details/8037918 今天,我们继续学习一些稍有难度的组合数取模问题,比如大组合数对合数取模,求大组合数的最后位数字等等. 首先来看组合数对合数取模问题 问题:求的值,其中和,并且是合数. 分析:先把素因子分解,然后转化为求,这里为素数,然后用CRT合并.所以现在重点来研究 如何求的值.这个问题AekdyCoin大神已经详细讲述了,如下链接     链接:http://h

排列组合+组合数取模 HDU 5894

1 // 排列组合+组合数取模 HDU 5894 2 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 3 // 思路: 4 // 定好m个人 相邻人之间k个座位 剩下就剩n-(m+1)*k个座位 5 // 剩下座位去插m个不同的盒子==就等价n个相同的球放m个不同的盒子 6 // 然后组合数出来了 7 // 乘n的话是枚举座位,除m是去掉枚举第一个座位的时候,剩下人相邻的座位相对不变的情况 8 9 #include <iostream> 10 #incl

大组合数取模之lucas定理模板,1&lt;=n&lt;=m&lt;=1e9,1&lt;p&lt;=1e6,p必须为素数

typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数 输入:C(n,m)%p 调用lucas(n,m,p) 复杂度:min(m,p)*log(m) ***********************************/ //ax + by = gcd(a,b) //传入固定值a,b.放回 d=gcd(a,b), x , y

组合数取模Lucas定理及快速幂取模

组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以直接用杨辉三角递推,边做加法边取模. (2) ,   ,并且是素数 本文针对该取值范围较大又不太大的情况(2)进行讨论. 这个问题可以使用Lucas定理,定理描述: 其中 这样将组合数的求解分解为小问题的乘积,下面考虑计算C(ni, mi) %p. 已知C(n, m) mod p = n!/(m!(

hdu 3037 Saving Beans 组合数取模模板题。。

Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2707    Accepted Submission(s): 1014 Problem Description Although winter is far away, squirrels have to work day and night to save b

toj 4111 组合数取模 暴力分解

题目大意:组合数取模,n和m并不算大,p比较大且是合数. 思路:暴力分解+快速幂 注:暴力也是有区别的,分解质因数时可以用以下work函数,写的非常巧妙,摘录自互联网. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 typedef long long ll; 6 const ll mod = 1ll << 32; 7 const int N = 1000001; 8 const

[BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 m 减去 Ai - 1 ,相当于将这一部分固定分给 xi,就转化为无限制的情况了. 如果有一些限制条件是 xi <= Ai 呢?直接来求就不行了,但是注意到这样的限制不超过 8 个,我们可以使用容斥原理来求. 考虑容斥:考虑哪些限制条件被违反了,也就是说,有哪些限制为 xi <= Ai 却是 xi

大组合数取模

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 考虑从(1,1)->(n,m)必定会向下走n-1步,向右走m-1步,那么总的走法是C(n-1+m-1,m-1). 关于组合数取模:大神博客:http://blog.csdn.net/acdreamers/article/details/8037918 1 #include <iostream> 2 #include <string.h> 3 #

BZOJ 3129 [Sdoi2013]方程 不定方程解的个数+组合数取模

题意:链接 方法:不定方程解的个数+组合数取模 解析: 先看n1与n2的部分的限制. 对于后半部分的限制来说,我们直接减去An1+i?1就可以转化一下求正整数解. 但是前半部分呢? 跟上一道猴子那个很像. 所以我们容斥搞就行了. 但是这道题好像不好写的地方不在这? 这题TMD不就是礼物吗! 大组合数取模如何取? 请参见我<BZOJ 礼物>的题解. 另外吐槽题干 明明是X1+X2+-+Xn=m 并不是小于等于 代码: #include <cstdio> #include <cs