题意:有n个组合,其中m组全错位排列的总数
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049
思路:n中有m个错位,并且其中m组全错位,ans=C(m,n)*sum[m],全错位排列递推式:sum[i] = i * sum[i-1] + (-1)^i;
注意点:没注意对sum求和时的有效情况,i >= 2时成立,直接将i从1开始赋值,整个序列错误。三次WA之后才查出这个问题。
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
12675875 | 2015-01-10 09:55:32 | Accepted | 2049 | 0MS | 1196K | 1286 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
ll num[30] = { 1, 1 };
inline ll C ( int m, int n ){
ll a = num[n];
ll b = num[m] * num[n-m];
return a / b;
}
int main()
{
ios::sync_with_stdio( false );
for ( int i = 1; i < 25; i ++ ){
num[i] = num[i-1] * i;
}
ll sum[25] = { 0 };
for ( int i = 2; i < 25; i ++ ){
sum[i] = i * sum[i-1];
( i & 1 ) ? sum[i] -- : sum[i] ++;
}
int n, m;
int ncase;
cin >> ncase;
while ( ncase -- ){
cin >> n >> m;
ll ans = C( m, n );
ans *= sum[m];
cout << ans << endl;
}
return 0;
}