0和1
题目描述
一个01字符串,长度是n,其中1比0多m个,请问不同的排列方案数有多少个?
输入
第一行是一个整数K,表示样例的个数。 以后每行两个整数n和m,1≤n≤33,0≤m≤n。
输出
每行输出一个样例的结果。
样例输入
4
2 0
2 1
3 0
3 1
样例输出
2
0
0
3
线索
第一个样例为"01"和"10";第二、三个样例不存在这样的串;第四个样例为"011",“101”,“110”
Sample Input
Sample Output
Source
先找规律判断是否存在这样的串。
若存在,用公式求出结果。
#include <stdio.h>
//次函数是为了求阶乘,用了递归思想
double fact(int a)//必须用double,用int会计算溢出
{
if(a==0)
{
return 1;
}
return a*fact(a-1);
}
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
int n,m;
int x,y;//x是1的数量,y是0的数量
double s;//s是排列的方案数,必须用double,用int在计算中会溢出
scanf("%d%d",&n,&m);
if((n%2==0&&m%2==1)||(n%2==1&&m%2==0))//不存在的规律
{
printf("0\n");
}
else
{
x=(n+m)/2;
y=(n-m)/2;
s=fact(n)/(fact(x)*fact(y));
printf("%.0lf\n",s);//.0使得不输出小数
}
}
return 0;
}
写于2021年9月7日18:36.