poj 2369 Permutations
问:一串数字经过多少次映射能变回自己?
例:4,1,5,2,3->2,4,3,1,5->1,2,5,4,3->4,1,3,2,5->2,4,5,1,3->1,2,3,4,5->4,1,5,2,3
要经过6次映射能变回4,1,5,2,3
可以看出,“4”只需要经过3次就变回“4”了,“5”只需要2次,而“4,5”要同时变回去的话,就需要(2,3)的最小公倍数次,6次。
#include <stdio.h> int gcd(int a,int b) { return b?gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int main() { int n,i,a,b,ans,num,p[1005]; while (scanf("%d",&n)!=EOF) { ans=1; for (i=1;i<=n;i++) scanf("%d",&p[i]); for (i=1;i<=n;i++) { b=p[i],a=p[b]; num=1; while (b!=a) { a=p[a]; num++; } ans=lcm(ans,num); } printf("%d\n",ans); } return 0; }