[2011山东ACM省赛] Binomial Coeffcients(求组合数)
组合 ACM 省赛 2011 山东
2023-09-11 14:14:10 时间
Binomial Coeffcients
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
输入
输出
演示样例输入
3 1 1 10 2 954 723
演示样例输出
1 45 3557658
提示
来源
山东省第二届ACM大学生程序设计竞赛
解题思路:
这道题坑死我了。。
本来非常easy的一道题,却怎么也做不正确。。就是求组合数。结果对10000003取模。一開始对c(m,n)是用公式直接求的。可是计算过程中涉及到取余。不能用下面代码写:
int c(int m,int n) { int sum=1; for(int i=1;i<=n;i++) { sum=sum*(m--)/i; sum%=mod; } return sum; }
这个代码是错误的。
比方 C(9,3)对5取余 上面的代码 的计算过程是这种 sum=sum*9/1 sum=9 sum%5=4 4*8/2=16 16%5=1 1*7/3 =?这下问题出来了把。不能整除。这个计算过程中不能进行取模运算,可是直接算又越界。后来又想到求组合数分子分母进行约分以后再计算,測试数据对。可是可怜的超时。哎。。因此仅仅能用组合递推得来算,由于每递推到一个数,假设它大于mod,就取模。这种一个组合式是正确的。由于题意就这样说得。因此由递推得到的每个组合式都是正确的。并且不会越界。
另外须要注意的是: c[0][0]=1 这个题少了这一句就WA
代码:
#include <iostream> #include <string.h> using namespace std; const int mod=10000003; const int N=1002; int c[N][N]; void init()//递推打表 { memset(c,0,sizeof(c)); c[0][0]=c[1][0]=c[1][1]=1; for(int i=2;i<N;i++) { c[i][i]=c[i][0]=1; for(int j=0;j<i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;//不会越界 } } } int main() { init(); int k;cin>>k; int a,b; while(k--) { cin>>a>>b; cout<<c[a][b]<<endl;//直接输出 } }
相关文章
- 【BZOJ3142】[HNOI2013]数列(组合计数)
- Linq中查询List组合相同值数量大于1
- ACM入门之【组合数】
- SAP MM 移动类型101与103+105组合混用?
- 《JUnit实战(第2版)》—— 2.4 用Suite来组合测试
- 《Android应用开发入门经典(第3版)》——第6.3节组合使用控件和适配器
- SwiftUI Sheet和Enum组合使用实现根据不同类型弹不同内容
- SwiftUI基础之Picker和Form组合实现数据选择
- LeetCode62之不同路径(相关话题:动态规划,组合排列,状态压缩)
- 高效学 C++|组合类的构造函数
- C语言实现Lagrange插值(用于插值组合导航结果)
- PSINS中19维组合导航模块sinsgps详解(初始赋值部分)
- 元素可重复的组合问题
- 【设计模式】发送生成的组合模式
- easyui datagrid Column Group 列组、 复杂表头 嵌套表头 组合表头 (转载)
- 交换机和路由器实现不同网段划分、不同vlan之间的通信、指定组合vlan进行网络通信
- python算法之组合总和