【Codeforces】542C - Idempotent functions(思路)

45 篇文章 1 订阅
6 篇文章 0 订阅

题目大意思:

给定一个数的next值,问最小的k值,使得每次进行k次操作得到的数都是一样的。

将每个位置i记为点i

记circle[i]为从i出发出现环的环内元素,我们的任务就是求这些数的最小公倍数lcm,还要考虑‘6’型循环的情况,这个我们只需要求最大的多余长度之后对lcm向上取整就好了

#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 205;
int next[maxn],vis[maxn];
LL circle[maxn],maxv = 0;
LL gcd(LL a,LL b){
    return b == 0 ? a : gcd(b,a % b);
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        scanf("%d",&next[i]);
    for(int i = 1; i <= n; i++){
        stack<int>Stack;
        memset(vis,0,sizeof(vis));
        int pos = i;
        circle[i] = 0LL;
        while(!vis[pos]){
                vis[pos] = 1;
                Stack.push(pos);
                pos = next[pos];
        }
        while(true){
             int e = Stack.top(); Stack.pop();
             circle[i] ++;
             if(e == pos) break;
        }
        maxv = max(maxv,(LL)Stack.size());
    }
    LL lcm = circle[1];
    for(int i = 2; i <= n; i++){
         lcm = lcm / gcd(lcm,circle[i]) * circle[i];
    }
    LL temp = maxv / lcm;
    if(maxv % lcm || maxv == 0) temp ++;
    LL ans = temp * lcm;
    printf("%lld\n",ans);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值