本文主要是介绍LIGHTOJ 1005(组合数学),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意: 给你一个n*n的正方形格子,填充m个车,使得两两不冲突,问你有多少种方法
解题思路: 在n行中选m行是C(n,m),在n列中选出m列 A(n,m),总共有C(n,m)*A(n,m)中方法
#include<stdio.h>
#include<string.h>
typedef double LL;//用__int64是个坑,要用double转换
LL C(LL n,LL m)
{LL sum_n = 1,sum_m = 1;for(LL i = n; i >= n-m+1; i--)sum_n *= i;for(LL i = m; i >= 1; i--)sum_m *= i;return sum_n/sum_m;
}
LL A(LL n,LL m)
{LL sum_n = 1;for(LL i = n; i >= n-m+1; i--)sum_n *= i;return sum_n;
}
int main()
{int t,Case = 1;LL n,m;scanf("%d",&t);while(t--){scanf("%lf%lf",&n,&m);printf("Case %d: ",Case++);if(n < m) printf("0\n");else printf("%.lf\n",C(n,m)*A(n,m));}
}
这篇关于LIGHTOJ 1005(组合数学)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!