1. 程式人生 > 實用技巧 >大數模板

大數模板

牛客第三場E題(存一下大數模板)

這題之前用python一直re,後來才知道遞迴爆棧了

c++題解

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
using namespace std;
typedef vector<int> VI;
 
const int N = 1e5+10;
int a[N];
int v[N];
 
namespace bigI
{
    const int bas = 1e4; // 壓位優化 1位代表四位十進位制
    void print(VI A)
    {
        if (A.size() == 0)
            return;
        printf("%d", A.back()); // uncheck A is empty
        for (int i = A.size() - 2; i >= 0; --i)
            printf("%04d", A[i]); // 長度為每一位代表的長度
        puts("");                 // 換行
    }
    // 整數加法就先用大數1成 轉成大數加
    VI add(VI A, VI B)
    {
        static VI C;
        C.clear();
        for (int i = 0, t = 0; i < (int)A.size() || i < (int)B.size() || t; ++i)
        {
            if (i < (int)A.size())
                t += A[i];
            if (i < (int)B.size())
                t += B[i];
            C.push_back(t % bas);
            t /= bas;
        }
        return C;
    }
 
    VI mul(VI A, ll b)
    {
        static VI C;
        C.clear();
        ll t = 0;
        for (int i = 0; i < (int)A.size() || t; ++i)
        {
            if (i < (int)A.size())
                t += A[i] * b;
            C.push_back(t % bas);
            t /= bas;
        }
        return C;
    }
    // 自己寫的 可能有錯
    VI div(VI A, ll B)
    {
        static VI C;
        C.clear();
        for (int i = (int)A.size() - 1, r = 0; i >= 0; --i)
        {
            r = r * bas + A[i];
            C.push_back(r / B);
            r %= B;
        }
        reverse(C.begin(), C.end());
        while ((int)C.size() > 1 && !C.back())
            C.pop_back();
        return C;
    }
} // namespace bigI
 
int dfs(int p) {
    if (v[p])
        return 0;
    v[p] = 1;
    return dfs(a[p]) + 1;
}
int b[N],num[N];
int main(){
    int n;
    cin >> n;
    for (int i = 1; i <= n;++i)
    {
        cin >> a[i];
    }
    vector<int> lens;
    for (int i = 1; i <= n;++i) {
        if(v[i])
            continue;
        int l = dfs(i);
        // cerr << l << '\n';
        lens.push_back(l);
    }
    for(auto i:lens){
        int x = i,sum=0;
        for(int j=2;j*j<=x;j++){
            sum=0;
            while(x%j==0){
                sum++;
                x = x / j;
            }
            num[j] = max(num[j],sum);
        }
        if(x > 1)
            num[x] = max(num[x],1);
    }
    VI ans = {1};
    for(int i=2;i<=n;i++){
        while(num[i] > 0){
            ans = bigI::mul(ans, i);
            num[i]--;
        }
    }
    bigI::print(ans);
    return 0;
}

py題解

import math as ma
v = []
a = []

n = int(input())
a = [0] + list(map(int,input().split()))
for i in range(0,100000):
    v.append(0)
v.append(0)
len = []
for i in range(1,n+1):
    if v[i] == 1:
        continue
    temp = 0
    j = i
    while v[j] == 0:
        temp += 1
        v[j] = 1
        j = a[j]
    len.append(temp)    
   
ans = 1
for i in len:
    ans = ans * i // ma.gcd(i,ans)
print(ans)