不是你想象中的组合数计算
2018-03-05 23:41
176 查看
我们印象中计算组合数的公式
C(kn)=A(kn)A(kk)
但其实,还有另外一个,常见于编程使用
C(kn)=C(k−1n−1)+C(kn−1)
Problem:挑选子集
Description
给定N个整数A1, A2, … AN,小Hi希望从中选出M个整数,使得任意两个选出的整数的差都是K的倍数。
请你计算有多少种不同的选法。由于选法可能非常多,你只需要输出对1000000009取模的结果。
Input
第一行包含三个整数N、M和K。
第二行包含N个整数A1, A2, … AN。
对于30%的数据,2 ≤ M ≤ N ≤ 10
对于100%的数据,2 ≤ M ≤ N ≤ 100 1 ≤ K, Ai ≤ 100
Sample Input
5 3 2
1 2 3 4 5
Sample Output
1
数学和计算机是紧密联系的,大家要多多思考
C(kn)=A(kn)A(kk)
但其实,还有另外一个,常见于编程使用
C(kn)=C(k−1n−1)+C(kn−1)
Problem:挑选子集
Description
给定N个整数A1, A2, … AN,小Hi希望从中选出M个整数,使得任意两个选出的整数的差都是K的倍数。
请你计算有多少种不同的选法。由于选法可能非常多,你只需要输出对1000000009取模的结果。
Input
第一行包含三个整数N、M和K。
第二行包含N个整数A1, A2, … AN。
对于30%的数据,2 ≤ M ≤ N ≤ 10
对于100%的数据,2 ≤ M ≤ N ≤ 100 1 ≤ K, Ai ≤ 100
Sample Input
5 3 2
1 2 3 4 5
Sample Output
1
#include <iostream> #include <cstring> #define ll long long using namespace std; const int mod =1000000009; int c[101][101];//记录组合数 int cnt[101];//记录模k的余数 int main() { int n,m,k,x; cin>>n>>m>>k; for(int i=0;i<n;++i){ cin>>x; x%=k; cnt[x]++; } c[0][0]=1; for(int i=1;i<=n;++i){ c[i][0]=1; for(int j=1;j<=i;++j){ c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } } ll ans=0; for(int i=0;i<k;++i){ if(cnt[i]>=m) ans += c[cnt[i]][m]; } ans %= mod; if(ans<0) ans += mod; cout<<ans<<endl; return 0; }
数学和计算机是紧密联系的,大家要多多思考
相关文章推荐
- 组合计算方法
- Knuth的计算组合数的较高精度算法
- 根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事
- 这不是你想象中的软件产业
- 计算组合数
- 使用php计算排列组合的方法
- python程序运行时间-期权组合计算
- POJ1306 UVA369 UVALive5341 Combinations【组合计算】
- 组合模式设计购物车价格计算实例(仅供学习使用)
- HDU2519 新生晚会【组合计算】
- 有时候我们缺乏的不是技术,而是想象
- PyalgoTrade 技术组合计算(四)
- 何时readonly 字段不是 readonly 的?结果出呼你想象!!!
- MapReduce端的二次排序以及对移动计算而不是移动数据的理解
- 计算组合数
- (转)开发linux设备驱动程序并不是想象的那么难
- 结果值在int类型内的排列组合计算
- 尝试在条件“$(_DeviceSdkVersion) >= 21”中对计算结果为“”而不是数字的“$(_DeviceSdkVersion)
- 云计算更多的是一种模式而不是技术
- SDUT 2241-计算组合数C(n,m)(递推)