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); } }