#include <bits/stdc++.h>
using namespace std;
long long ans[25];//ans[n]表示 n个全错的可能性
long long js(int x) //阶乘计算
{
long long ans = 1;
for (long long i = 2; i <= x; i++)
ans *= i;
return ans;
}
long long cjs(long long x, long long y)
{
return js(y) / (js(x) * js(y - x));
} // C 计算 计算 Cx y ;
int main()
{
ans[1] = 0; //ans[n]表示 n个全错的可能性
ans[2] = 1;/
for (long long i = 3; i <= 20; i++)
{
ans[i] = js(i);
ans[i] -= 1; //减去全部正确的方案
for (long long j = 2; j < i; j++)
{
long long cnt = (ans[j] * cjs(j, i)); //挑选j个错的可能数为ans[j],剩下的(i-j)全对。
ans[i] -= cnt; //能挑选出C(i,j)组。 所以应该乘上C(i,j);
}
}
long long n;
while (cin >> n)
{
cout << ans[n] << endl; //已经将题目范围的组数预处理完成,直接输出即可。
}
return 0;
}
错排问题暴力方法 HDU 不容易系列之一
最新推荐文章于 2024-08-25 15:49:03 发布