HDU 4259 Double Dealing【简单群置换】
来源:互联网 发布:数据统计系统 编辑:程序博客网 时间:2024/06/08 06:26
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4259
题目大意:给出n张卡片以及k个人,现在对卡片进行分堆,然后分发(这样卡片改变了顺序),依次这样问多少次后卡片顺序回到原来一样。
比如给出的10,3.
第一次分堆是这样的
第一人:1,4,7,10
第二人:2,5,8
第三人:3,6,9
其顺序由1 2 3 4 5 6 7 8 9 10 变成了 10 7 4 1 8 5 2 9 6 3
即:
10 3第一次10 7 4 1 8 5 2 9 6 3第二次3 2 1 10 9 8 7 6 5 4第三次4 7 10 3 6 9 2 5 8 1第四次1 2 3 4 5 6 7 8 9 10在第四次可以回到原来的顺序。
其循环节是:
位置的变化有如下规律:
1->4->3->10->1; 循环节是4
2->7->2; 循环节是2
5->6->9->8->5; 循环节是4
其最大的公约数是4.
故其答案是4.
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#define LL long longusing namespace std;int a[1000], vis[1000];LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b);}int main(){ int i,j,n,k,t; while(~scanf("%d%d",&n,&k)){ LL ans,sum=1; if(n==0&&k==0) break; t=0; for(i=0; i<k&&i<n; i++) for(j=(n-i-1)/k*k+i; j>=0; j-=k) a[t++]=j; for(int i=0;i<=n;i++) cout<<a[i]<<endl; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++){ int x=i; ans=0; while(!vis[x]){ ans++; vis[x]=1; x=a[x]; } if(ans) sum=sum/gcd(sum,ans)*ans; } printf("%I64d\n",sum); }}
0 0
- HDU 4259 Double Dealing【简单群置换】
- HDU 4259 Double Dealing(置换群啊)
- hdu 4529 Double Dealing (置换群)
- HDOJ 4259 Double Dealing(置换群)
- hdu4259 Double Dealing----置换群
- hdu4259 Double Dealing (置换群).
- HDU 4259 Double Dealing
- TOJ 4351 HDU 4259 Double Dealing
- hdu 4259 Double Dealing(循环节+最小公倍数)
- HDOJ 4259 Double Dealing
- HDU 4259 Double Dealing (离散数学)#By Plato
- HDU 4259 - Double Dealing(求循环节)
- HDU 4259 Double Dealing 8-25日网络赛1003题
- HDU 4259(Double Dealing-lcm(x1..xn)=lcm(x1,lcm(x2..xn))
- hdu 4259 置换群
- Double Dealing----HDU4259----找规律
- HDU-置换群
- HDU 5495 置换群
- MySql常用语句
- Windows下如何用C语言打印当前进程的进程号?
- Egret开发《消灭方块》后记(四)让游戏流畅的大杀器——分帧运算
- 继承成员访问控制机制(C++)
- c++调用matlab 的问题
- HDU 4259 Double Dealing【简单群置换】
- 有趣的数
- 解决Android SDK Manager下载太慢问题
- 杭电 2519 新生晚会(精度问题,double )
- codevs2822 爱在心中
- SIGHUP信号与控制终端
- 授权中的with admin option和with grant option
- 从美国某品牌的新款手机发售说起
- display:inline-block