大數模板
阿新 • • 發佈:2020-07-25
牛客第三場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)