Codeforces Round#383(Div.2)C(再帰的にループを探して最小公倍数を求める)
4161 ワード
问题链接题目大意:意味が少し回りくどいことを表して、何owwwの、通俗的に言えばリングを探して、闻くのはxを満たしてyの歩数までyをxまで歩かせることができます.解析では、xがxに進むのが偶数nである場合、n/2でyに進むことができ、yがxに等しくない場合、n/2ステップ数でxに進むことができることを示す.このループの重み値はn/2である.nが奇数である場合、このループの重み値はnである.そして、すべてのループの重み値を見つけて、彼らの最小公倍数を求めます.答えが得られる
#include
#include
long long a[1010];
int vis[1010]; //
int flog; //
long long b[1010];
long long gcd(long long aa,long long bb)
{
return bb==0?aa:gcd(bb,aa%bb);
}
long long dfs(int u,int t,int now)
{
if(now==u&&vis[u]) //
return t;
if(vis[now]) //
return -1;
vis[now]=1;
dfs(u,t+1,a[now]);
}
int main()
{
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
flog=0;
int cut=0;
for(int i=1;i<=n;i++)
{
if(vis[i])
continue;
b[cut++]=dfs(i,0,i);
if(b[cut-1]==-1)
{
printf("-1
");
flog=1;
break;
}
if(b[cut-1]%2==0) //
b[cut-1]/=2;
}
if(!flog)
{
long long aa=b[0];
long long bb;
for(int i=1;i//
{
bb=aa*b[i];
aa=gcd(aa,b[i]);
aa=bb/aa;
}
printf("%lld
",aa);
}
}