博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Uva 11077 Find the Permutations [置换群 DP]
阅读量:6529 次
发布时间:2019-06-24

本文共 922 字,大约阅读时间需要 3 分钟。

题意:

给定$n$和$k$,问有多少排列交换$k$次能变成升序

$n \le 21$


 

$uva$貌似挂掉了$vjudge$上一直排队

从某个排列到$1,2,...,n$和从$1,2,...,n$到某个排列是一样的

排列就是置换,分解循环,然后显然每个循环变成升序需要$len-1$次交换

然后有$t$个循环的置换需要$n-t$次交换

$DP$就行了$f[i][j]$表示前$i$个数有$j$个循环

其实可以发现就是第一类$stirling$数

注意:以后一定要测一遍极限会爆$long\ long$

#include
#include
#include
#include
#include
using namespace std;const int N=30;typedef unsigned long long ll;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){
if(c=='-')f=-1; c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} return x*f;}int n,k;ll f[N][N];void dp(){ f[0][0]=1; for(int i=1;i<=21;i++) for(int j=1;j<=21;j++) f[i][j]=f[i-1][j-1]+f[i-1][j]*(i-1);}int main(){ //freopen("in","r",stdin); dp(); while(true){ n=read();k=read(); if(n==0&&k==0) break; printf("%llu\n",f[n][n-k]); }}

 

转载地址:http://katbo.baihongyu.com/

你可能感兴趣的文章
Linux软中断、tasklet和工作队列
查看>>
如何解决ORA-28002 the password will expire within 7 days问题(密码快过期)
查看>>
Asp.Net Core 轻松学-利用日志监视进行服务遥测
查看>>
LightSwitch社区资源搜集
查看>>
Android通讯录查询篇--ContactsContract.Data 二(续)
查看>>
IT人的自我导向型学习:开篇杂谈
查看>>
[原创]BizTalk动手实验系列目录
查看>>
HDU 4611Balls Rearrangement(思维)
查看>>
[LeetCode] Majority Element II
查看>>
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
查看>>
我的Dll(动态链接库)学习笔记(转)
查看>>
应用程序域
查看>>
有向图的拓扑排序算法JAVA实现
查看>>
HTML页面跳转的5种方法
查看>>
ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
查看>>
李洪强-C语言5-函数
查看>>
开源监控利器grafana
查看>>
Android获取当前时间与星期几
查看>>
jenkins2 multibranch
查看>>
Css定位-定位
查看>>