两题均是错排公式与阶乘的运用
2048算的是一个比例,2049计算的是一个事情发生的总数
一个用double 来存放数据,一个用long long来存放数据
2048
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
double a[25],b[25];
int main ()
{
memset(a,1,sizeof(a));
memset(b,1,sizeof(b));
a[1]=0;
a[2]=1;
b[1]=1;
b[2]=2;
for(int i=3;i<=20;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
b[i]=b[i-1]*i;
}
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%.2lf",a[m]/b[m]*100);
printf("%c",'%');
printf("\n");
}
return 0;
}
2049
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
long long a[25],b[25];
int main ()
{
memset(a,1,sizeof(a));
memset(b,1,sizeof(b));
b[0]=1;
a[1]=0;
a[2]=1;
b[1]=1;
b[2]=2;
for(int i=3;i<=20;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
b[i]=b[i-1]*i;
}
int T,m,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
printf("%lld\n",(b[n]/b[m]/b[n-m]*a[m]));
}
return 0;
}