您的位置:首页 > 其它

UVA 11077 Find the Permutations

2012-11-02 13:45 302 查看
/*
dp[i][j]表示递推到i时,swap的次数为j时的方案数。
i要么单独形成1个循环节,这时不增加swap的次数,要么放到前i-1个数某个数的后面,从而插入到某个循环中,这样swap的次数会+1。
*/
#include<stdio.h>
#include<string.h>
typedef unsigned long long LL;
int N, K;
LL dp[25][25];
void prep()
{
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= 21; i ++)
for(int j = 0; j < i; j ++)
{
dp[i][j] = dp[i - 1][j];
if(j) dp[i][j] += dp[i - 1][j - 1] * (i - 1);
}
}
int main()
{
prep();
while(scanf("%d%d", &N, &K), N)
printf("%llu\n", dp
[K]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: