POJ 1721 CARDS
发布日期:2021-05-04 16:53:04 浏览次数:24 分类:技术文章

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

题目链接

思路

题目中一开始给出的置换是一个大环,因此一定存在一个 x x 使得置换在经过

x
次洗牌操作后得到原来的置换。
那么最终答案就是原置换在经过 xSmodx x − S mod x 次操作后的置换,显然,答案置换经过 S S <script type="math/tex" id="MathJax-Element-138">S</script>次操作就是原置换。

代码

#include 
const int maxn=1000;int a[maxn+10],n,s,tmp[maxn+10],t[maxn+10];int main(){ scanf("%d%d",&n,&s); for(register int i=1; i<=n; ++i) { scanf("%d",&a[i]); tmp[i]=a[i]; } int cnt=0,flag=1; while(flag) { ++cnt; for(register int i=1; i<=n; ++i) { t[i]=tmp[tmp[i]]; } for(register int i=1; i<=n; ++i) { tmp[i]=t[i]; if(tmp[i]==a[i]) { flag=0; } } } cnt=cnt-s%cnt; while(cnt--) { for(register int i=1; i<=n; ++i) { t[i]=tmp[tmp[i]]; } for(register int i=1; i<=n; ++i) { tmp[i]=t[i]; } } for(register int i=1; i<=n; ++i) { printf("%d\n",tmp[i]); } return 0;}
上一篇:浅谈算法——从多项式乘法到FFT
下一篇:SGU 282 Isomorphism

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月12日 05时45分05秒