码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4259

时间:2014-10-15 23:33:01      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   for   sp   div   on   log   amp   

虽然知道是置换,却很久没有思路。忽然想到,由初始状态A经过变换后回到A状态,应该是不停循环可重复的。于是,猜想数字的位置也是重复循环的。拿了个例子验证了一下,某然是这样。例如第二个10,3的例子有1-》4-》3-》10-》1.

于是,可以按照上题的方法求解了。

#include <iostream>
#include <algorithm>
#include <cstdio>
#define LL __int64
#define N 800
using namespace std;

int num[N+1];
bool vis[N+1];
int stack[N+1],top;

LL gcd(LL a,LL b){
	if(b==0) return a;
	return gcd(b,a%b);
}

int main(){
	int n,k;
	while(scanf("%d%d",&n,&k),n||k){
		if(n<=k){
			printf("1\n");
			continue;
		}
		memset(vis,false,sizeof(vis));
		int counted=0;
		for(int i=1;i<=n;i++){   //此处是可以优化的,可以通过计算来做。 
			if(!vis[i]){
				int tmp=i;
				top=0;
				while(tmp<=n){
					vis[tmp]=true;
					stack[++top]=tmp;
					tmp+=k;
				}
				while(top>0){
					num[++counted]=stack[top];
					top--;
				}
			}
		}
		memset(vis,false,sizeof(vis));
		top=0;
		for(int i=1;i<=n;i++){
			if(!vis[i]){
				int k=i;
				counted=0;
				while(!vis[k]){
					vis[k]=true;
					k=num[k];
					counted++;
				}
				stack[++top]=counted;
			}
		}
		LL ans=(LL)stack[top--];
		for(int i=top;i>0;i--){
			ans=ans*((LL)stack[i]/gcd(ans,(LL)stack[i]));
		}
		printf("%I64d\n",ans);
	}
	return 0;
}

  

HDU 4259

标签:blog   io   os   for   sp   div   on   log   amp   

原文地址:http://www.cnblogs.com/jie-dcai/p/4027396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!