poj 1354 Placement of Keys(错排变形)

来源:互联网 发布:python快速开发平台 编辑:程序博客网 时间:2024/06/06 03:21


题目大意:n个盒子对应n个锁,n个锁对应着唯一可以打开它的n把钥匙,现将n把钥匙封于n个盒
子中,只撬开1 2两个盒子,不能再撬开其他盒子,用已撬开或者打开的盒子内的钥匙来开别的盒
子,问能够最终打开所有盒子的钥匙的放置方法有多少种。
题目分析:
这题是一个错排问题,就是在排列中不存在恰好i1,i2,i3,...,ik包含i1,i2,i3,...,ik号钥匙的情
况(不一定一一对应,只要恰好包含即可)k<n,这题用传统的错排推公式是可以完成的,但是比

复杂,我们可以设以1和2中一个点为起始点依次打开所有盒子,形成一个环,那么我们可以把1 2
放置于环上的任意位置上,即n*(n-1),但是环上无绝对位置,所以最终为n-1种,然后剩下n-2全
排列,所以为(n-1)!
当然1和2也可以独自成环,环的大小即解x+y=n的正整数解方程,n-1个解,剩下的n-2个数可以全
排列,作为环上顺序,所以为(n-1)*(n-2)!,所以为(n-1)!,即结果为2*(n-1)!
这题范围比较大,要用高精度


 #include<iostream>#include<cstdio>using namespace std;int arr[10000];void factorial(int n)//求阶乘{     memset(arr,0,sizeof(arr)); arr[1]=2; int c=1,temp,temp1; for(int i=2;i<=n;i++) { temp=0; for(int j=1;j<=c;j++) { temp1=arr[j]*i+temp; arr[j]=temp1%10; temp=temp1/10; } while(temp!=0)// {             arr[++c]=temp%10; temp/=10; } } for(int i=c;i>=1;i--) printf("%d",arr[i]); printf("\n");}int main(){int n;while(scanf("%d",&n)!=EOF&&n!=0){printf("N=%d:\n",n);factorial(n-1);}//system("pause");return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑换主机以前的文件怎么办 货车卖了没过户怎么办 微交易出金不了怎么办 直播时出现央视影音客户端怎么办 qq账号暂时无法登录怎么办 饿了吃东西胃疼怎么办 早上不吃饭胃疼怎么办 孕晚期胃疼呕吐怎么办 胃疼了一晚上怎么办 微信视频图像倒立怎么办 ps链接图层锁定怎么办 慕课过时间了怎么办 异地恋又要考研怎么办 阴阳师手机绑定上限了怎么办 高考口令卡丢了怎么办 网易将军令换手机了怎么办 须弥bb有弱点土怎么办 战网密码忘记了怎么办 梦三账号忘了怎么办 快手手机号被注册了怎么办 快手该手机号已注册怎么办 手机号被别人注册了快手怎么办 快手显示手机号已注册怎么办 163的邮箱忘了怎么办 河长制账号密码忘了怎么办 网易登录名忘了怎么办 网易通行证安全手机忘了怎么办 美团数据获取失败怎么办 扣扣图片加载不出来怎么办 电脑qq最小化后不见了怎么办 uwp桌面快捷图标显示异常怎么办 网易云自动切歌怎么办 捡到小米手机怎么办才能自己用 dnf启动安装程序出错怎么办 苹果手机相册视频下载出错怎么办 苹果7软件闪退怎么办 微信上有钱账号就是怎么办 手机网速不给力怎么办 xp系统登录密码忘了怎么办 手机百度云网络出错怎么办 百度账号提示异常风险怎么办