poj 3590 The shuffle Problem(置换群+DP)
题目链接:poj 3590 The shuffle Problem
题意:
给你一个数n,让你找一个字典序最小的置换序列,使得变换整个周期最大。
题解:
由于置换群的性质,我们可以将n拆分成m个数,使得这m个数的和为n,并且这m个数的最小公倍数最大。
dp可以求出将n拆分后的最大的最小公倍数。
然后可以将这个最大的最小公倍数分解为pi^mi+pi^mi+pi^mi...。
对于每一个pi^mi,就是一个循环的轮数。
然后将这些循环的轮数排序后输出对于的数字就行了。
PS:当前面的总和sum小于n时,前n-sum的循环轮数就全是1,这些数不会影响最大的最小公倍数。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define F(i,a,b) for(int i=a;i<=b;++i) 5 using namespace std; 6 typedef long long ll; 7 8 const int N=101; 9 10 int primes[N+1],tot=0; 11 bool vis[N+1]; 12 void Euler(){ 13 memset(vis,0,sizeof(vis)); 14 F(i,2,N){ 15 if(!vis[i])primes[++tot]=i; 16 F(j,1,tot){ 17 if(i*primes[j]>N)break; 18 vis[i*primes[j]]=1; 19 if(i%primes[j]==0)break; 20 } 21 } 22 } 23 24 int dp[N][N],mx[N],cnt,tmp,t,sum,n,ans[N]; 25 26 void init() 27 { 28 F(i,1,100)F(j,1,100)dp[i][1]=i; 29 F(i,1,100) 30 { 31 F(j,1,i) 32 { 33 F(k,1,i-1) 34 { 35 int tmp=dp[i-k][j-1]*k/__gcd(dp[i-k][j-1],k); 36 if(dp[i][j]<tmp)dp[i][j]=tmp; 37 } 38 } 39 F(j,1,i)mx[i]=max(dp[i][j],mx[i]); 40 } 41 } 42 43 int main() 44 { 45 Euler(),init(); 46 scanf("%d",&t); 47 while(t--) 48 { 49 scanf("%d",&n); 50 tmp=mx[n],sum=cnt=0; 51 printf("%d",mx[n]); 52 int tmp=mx[n],tp; 53 F(i,1,25) 54 { 55 if(primes[i]>tmp)break; 56 if(tmp%primes[i]==0) 57 { 58 tp=1; 59 while(tmp%primes[i]==0)tmp/=primes[i],tp*=primes[i]; 60 ans[++cnt]=tp,sum+=tp; 61 } 62 } 63 sort(ans+1,ans+1+cnt); 64 F(i,1,n-sum)printf(" %d",i); 65 int now=1,num=ans[now],ct=0; 66 F(i,n-sum+1,n) 67 { 68 if(ct==num-1) 69 printf(" %d",i-ct),ct=0,num=ans[++now]; 70 else printf(" %d",i+1),ct++; 71 } 72 puts(""); 73 } 74 return 0; 75 }
View Code
转载于:https://www.cnblogs.com/bin-gege/p/7074305.html
poj 3590 The shuffle Problem(置换群+DP)相关推荐
- poj 3590 The shuffle Problem——DP+置换
题目:http://poj.org/problem?id=3590 bzoj 1025 的弱化版.大概一样的 dp . 输出方案的时候小的环靠前.不用担心 dp 时用 > 还是 >= 来转 ...
- POJ-3590 The shuffle Problem 置换+DP | DFS
题目链接:http://poj.org/problem?id=3590 自己暴力给水过去了,不过效率有点低.题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大.题目数据量不大, ...
- POJ 2826 An Easy Problem?! 叉积求多边形面积 【计算几何】
ACM博客_kuangbin POJ 2826 An Easy Problem?! An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536 ...
- 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
[线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...
- poj 3254 Corn Fields (状态压缩DP)
题目:http://poj.org/problem?id=3254 思路见代码: #include<iostream> using namespace std;const int MOD= ...
- POJ 3186Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- POJ 1155 TELE【树形DP】
POJ 1155 TELE http://poj.org/problem?id=1155 大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端, 其余点为转发站.客户端i ...
- POJ 2096 Collecting Bugs:期望dp
题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...
最新文章
- Python Web实时消息后台服务器推送技术---GoEasy
- android 安装环境及入门
- Leetcode 55.跳跃游戏 (每日一题 20210706)
- 【通知】深度学习之人脸图像算法重印,欢迎读者支持!
- 加载spring上下文的多种方式总结
- java 空接口_学Java,java接口搞明白了吗?大牛让你一文搞清楚
- Django基础之中间件
- Intellij IDEA 识别不了@Slf4j和log的问题
- utilities(C++)——单例(Singleton) (使用智能指针 shared_ptr)
- ios ffmpeg(libfdk-aac) aac encode
- 日语输入法电脑版_如何安装日语输入法?(手机/电脑安装使用指南)
- Eclipse中执行Tomcat源代码
- 测试软件测显卡有啸叫,完美解决 显卡电流声!显卡啸叫!吱吱的电流声!附解决方案!...
- 沪牌学院-沪拍拍课堂2: 出价策略
- 通过几种方式来查看windows vista的激活状态
- 股票学习-量柱和k线-第四天
- 人类数据总量_人类身体的11个极限数据
- 一、大话HTTP协议-HTTP的前世今生
- 170323 PyQt5 ListWidget的删除
- 颜色的前世今生19·外传之PPI、LPI、DPI疑难问题解答
热门文章
- 在线预览视频/直播:m3u8、rmpt、mp4、flv
- 【Java】 获取当前项目所有的线程
- [linux] sftp/ssh异常:ssh_selinux_copy_context getcon failed with No such file or directory
- react追加html元素,React给添加元素增加样式
- r型聚类分析怎么做_营销型网站怎么做?
- graphpad如何做x轴在上方的图_数据分析最有用的25个 Matplotlib图
- zigbee 串口不稳定_Zigbee
- pythoncgi模块文档_python使用cgi模块处理表单
- android 取色器_音乐剪辑器手机版下载-音乐剪辑器app下载v9.10.15 安卓免费版
- 【转】自然语言系列学习之表示学习与知识获取(一)分布式表示