牛客(多校5): Bogo Sort

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例1:
输入

5
1 2 3 4 5

输出

1

示例2:
输入

6
2 3 4 5 6 1

输出

6

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
const ll save=1e8;
int n,a[maxn];
bool vis[maxn];
vector<ll> res;
map<ll,int> factors;
void getfactors(ll n){
    for(ll i=2;i*i<=n;i++){
        if(n%i) continue;
        int t=0;
        while(n%i==0) n/=i,t++;
        factors[i]=max(factors[i],t);
    }
    if(n>1) factors[n]=max(factors[n],1);
}
int main(){
    scanf("%d",&n);
    rep(i,1,n+1) scanf("%d",a+i);
    rep(i,1,n+1){
        if(vis[i]) continue;
        ll loop=1;
        for(int j=a[i];j!=i;j=a[j]) loop++,vis[j]=1;
        getfactors(loop);
    }
    res.push_back(1);
    for(auto fa:factors){
        ll base=fa.first,times=fa.second;
        ll t=1;while(times--) t*=base;
        ll rem=0;
        for(int i=0;i<res.size();i++){
            res[i]=res[i]*t+rem;
            rem=res[i]/save;
            res[i]%=save;
        }
        if(rem) res.push_back(rem);
    }
    printf("%lld",res.back());
    for(int i=res.size()-2;~i;i--) printf("%08lld",res[i]);
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107584858