组合数的计算
Time Limit: 2000ms Memory limit: 32768K 有疑问?点这里^_^
题目描述
给定n组整数(a,b),计算组合数C(a,b)的值。如C(3,1)=3,C(4,2)=6。
输入
第一行为一个整数n,表示有多少组测试数据。(n <= 100000)
第2-n+1行,每行两个整数分别代表a,b;中间用空格隔开。(a,b <= 40)
输出
对于每组输入,输出其组合数的值。每个输出占一行。
示例输入
4 3 1 4 2 5 0 1 1
示例输出
3 6 1 1
提示
来源
moon
示例程序
//数据要用long long int才行,另外在第二种方法中注意continue的用法
- #include<stdio.h>
- #include<string.h>
- #define N 60
- long long int a[N][N];
- int main()
- {
- int n, m, T;
- for(int i=0;i<50;i++)
- {
- a[i][i]=1;
- a[i][0]=1;
- }
- for(int i=1;i<50;i++)
- {
- for(int j=1;j<=i;j++)
- {
- a[i][j]=a[i-1][j-1]+a[i-1][j];
- }
- }
- scanf("%d", &T);
- while(T--)
- {
- scanf("%d%d", &n, &m);
- printf("%lld\n", a[n][m]);
- }
- return 0;
- }
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- long long int T;
- scanf("%lld", &T);
- while(T--)
- {
- long long int n, m, i, j;
- long long int s1=1, s2=1;
- scanf("%lld%lld", &n, &m);
- if(m==0 || m==n)
- {
- printf("1\n");
- continue;
- }
- for(i=n,j=1; j<=m; j++,i--)
- {
- s1*=i;
- s2*=j;
- if(s1%s2==0)
- {
- s1=s1/s2;
- s2=1;
- }
- }
- printf("%lld\n", s1/s2);
- }
- return 0;
- }