uva11077 Find the Permutations(置換+遞推)
阿新 • • 發佈:2021-07-31
https://vjudge.net/problem/UVA-11077
題意:
給定n和k,問有多少n的排列能夠通過至少k次交換變成{1,2,3,……n}
一個排列P變成{1,2,3,……n}所需的最少交換次數 等於{1,2,3,……n}變成P所需的最少交換次數
把P理解為一個置換,分解為迴圈
含c個元素的迴圈需要交換c-1次
設f(i,j)表示至少需要j次交換變成{1,2,……n}的排列個數
元素i要麼自己構成迴圈,要麼加入前面任意一個迴圈的數後面
所以f(i,j)=f(i-1,j)+f(i-1,j-1)*(i-1)
#include<bits/stdc++.h> using namespace作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。std; unsigned long long f[22][22]; int main() { f[1][0]=1; for(int i=2;i<=21;++i) for(int j=0;j<i;++j) { f[i][j]=f[i-1][j]; if(j) f[i][j]+=f[i-1][j-1]*(i-1); } int n,k; while(scanf("%d%d",&n,&k)) { if(!n && !k) return0; cout<<f[n][k]<<'\n'; } }