Editorial for Queue
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> #define maxN 500050 #define maxP 44444 #define fr(a,b,c) for (a=b;a<=c;a++) #define frr(a,b,c) for (a=b;a>=c;a--) using namespace std; int test,n,z,P,s[maxN],d[maxN],A[maxN],st[maxN],last,sum[maxN],par[maxN],cur[maxN]; int p[maxP],r[maxP]; vector <int> a[maxN]; void prime() { int i,j; fr(i,2,707) if (!d[i]) { j=i*i; while (j<=maxN) d[j]=-1, j+=i; } fr(i,2,maxN) if (!d[i]) p[++P]=i, d[i]=P; } void dfsStack() { st[++last]=1; while (last) { int x=st[last]; if (cur[x]<int(a[x].size())) st[++last]=a[x][cur[x]++]; else { last--; s[x]=sum[x]+1; for (int i=0;i+1<int(a[x].size());i++) { int y=a[x][i]; A[sum[x]]++; A[sum[x]-s[y]]--; A[s[y]]--; sum[x]-=s[y]; } sum[par[x]]+=s[x]; } } } void calc() { int i,j,x; frr(i,n,2) { A[i]+=A[i+1]; if (A[i]) { x=i; j=1; while (x>1 && d[x]<0) { while (x%p[j]==0) r[j]+=A[i], x/=p[j]; j++; } if (x>1) r[d[x]]+=A[i]; } } long long re=1; fr(i,1,maxP) while (r[i]) r[i]--, re=(re*p[i])%z; cout << re << endl; } int main() { int i; prime(); cin >> test; while (test--) { cin >> z >> n; fr(i,2,n) { scanf("%d",&par[i]); a[par[i]].push_back(i); } dfsStack(); calc(); if (test) fr(i,1,n+1) A[i]=sum[i]=s[i]=cur[i]=0, a[i].clear(); } return 0; }
Code mẫu của ladpro98
#include <bits/stdc++.h> const int N = 500005; using namespace std; int sz[N], par[N], nChild[N], np[N], cnt[N], P[N]; int n, MOD, nTest, nPrime; long long power(long long a, int p) { long long ans = 1; while (p) { if (p & 1) ans = ans * a % MOD; a = a * a % MOD; p >>= 1; } return ans; } int main() { ios::sync_with_stdio(0); cin.tie(0); for (int i = 2; i * i < N; ++i) if (!np[i]) for (int j = i * i; j < N; j += i) np[j] = i; for (int i = 2; i < N; ++i) if (!np[i]) { np[i] = i; P[nPrime++] = i; } cin >> nTest; while (nTest--) { cin >> MOD >> n; for (int i = 2; i <= n; ++i) { cin >> par[i]; ++nChild[par[i]]; } queue<int> Q; for (int i = 1; i <= n; ++i) { sz[i] = 1; if (nChild[i] == 0) Q.push(i); } while (!Q.empty()) { int u = Q.front(); Q.pop(); sz[par[u]] += sz[u]; if ((--nChild[par[u]]) == 0) Q.push(par[u]); } for (int i = 0; i < nPrime; ++i) for (long long j = P[i]; j < sz[1]; j *= P[i]) cnt[P[i]] += (sz[1] - 1) / j; for (int i = 2; i <= n; ++i) for (int x = sz[i]; x > 1; x /= np[x]) --cnt[np[x]]; long long ans = 1; for (int i = 0; i < nPrime; ++i) if (cnt[P[i]]) { ans = ans * power(P[i], cnt[P[i]]) % MOD; cnt[P[i]] = 0; } cout << ans << '\n'; } return 0; }
Code mẫu của RR
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <string> #include <deque> #include <complex> #define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--) #define REP(i,a) for(int i=0,_a=(a); i<_a; i++) #define ll long long #define F first #define S second #define PB push_back #define MP make_pair using namespace std; const double PI = acos(-1.0); int nprime, prime[500111]; bool sieve[500111]; void init() { FOR(i,2,720) if (!sieve[i]) { int j = i * i; while (j <= 500000) { sieve[j] = true; j += i; } } FOR(i,2,500000) if (!sieve[i]) prime[nprime++] = i; } ll base; int n, sz[500111], d[500111], vao[500111]; vector<int> ke[500111]; int st[500111], top, last[500111]; void dfs() { top = 1; st[1] = 1; FOR(i,1,n) sz[i] = 1; memset(last, 0, sizeof last); while (top) { int u = st[top]; if (last[u]) sz[u] += sz[ke[u][last[u]-1]]; if (last[u] < ke[u].size()) { int v = ke[u][last[u]]; st[++top] = v; ++last[u]; } else --top; } } ll power(ll x, int k) { if (k == 0) return 1; if (k == 1) return x % base; ll mid = power(x, k >> 1); mid = (mid * mid) % base; if (k & 1) return (mid * x) % base; else return mid; } int get(int n, int p) { if (n < p) return 0; return n/p + get(n/p,p); } void remove(int n) { REP(x,nprime) { if (prime[x] * prime[x] > n) break; int k = 0; while (n % prime[x] == 0) { n /= prime[x]; k++; } d[x] -= k; } if (n > 1) { int x = lower_bound(prime, prime+nprime, n) - prime; d[x]--; } } //Buffer reading int INP,AM; #define BUFSIZE (1<<12) char BUF[BUFSIZE+1], *inp=BUF; #define GETCHAR(INP) { \ if(!*inp) { \ if (feof(stdin)) memset(BUF, 0, sizeof BUF); else fread(BUF,1,BUFSIZE,stdin); \ inp=BUF; \ } \ INP=*inp++; \ } #define DIG(a) (((a)>='0')&&((a)<='9')) #define GN(j) { \ AM=0;\ GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\ if (INP=='-') {AM=1;GETCHAR(INP);} \ j=INP-'0'; GETCHAR(INP); \ while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \ if (AM) j=-j;\ } //End of buffer reading int main() { // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); init(); int test; GN(test); while (test--) { GN(base); GN(n); FOR(i,1,n) ke[i].clear(); int u; FOR(i,2,n) { GN(u); ke[u].PB(i); } dfs(); REP(x,nprime) d[x] = get(n-1, prime[x]); FOR(i,2,n) remove(sz[i]); ll res = 1; // REP(x,nprime) cout << d[x] << ' '; cout << endl; REP(x,nprime) res = (res * power(prime[x], d[x])) % base; cout << res; puts(""); } return 0; }
Code mẫu của hieult
#include<cstdio> #include<cmath> #include<math.h> #include<cstring> #include<cstdlib> #include<cassert> #include<ctime> #include<algorithm> #include<iterator> #include<iostream> #include<cctype> #include<string> #include<vector> #include<map> #include<set> #include<queue> #include<list> #define fi first #define se second #define PB push_back #define MP make_pair #define ep 0.00000001 #define oo 1111111111 #define mod 1000000007 #define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++) #define rep(i, n) for(int i = 0; i < n; i++) #define FOR(i, a, b) for(int i = a; i <= b; i++) #define FORD(i, a, b) for(int i = a; i >= b; i--) //#include <conio.h> //#define g 9.81 #define maxn 500005 double const PI=4*atan(1.0); const int bfsz = 1 << 16; char bf[bfsz + 5]; int rsz = 0;int ptr = 0; char gc() { if (rsz <= 0) { ptr = 0; rsz = fread(bf, 1, bfsz, stdin); if (rsz <= 0) return EOF; } --rsz; return bf[ptr++]; } void ga(char &c) { c = EOF; while (!isalpha(c)) c = gc(); } int gs(char s[]) { int l = 0; char c = gc(); while (isspace(c)) c = gc(); while (c != EOF && !isspace(c)) { s[l++] = c; c = gc(); } s[l] = '\0'; return l; } template<class T> bool gi(T &v) { v = 0; char c = gc(); while (c != EOF && c != '-' && !isdigit(c)) c = gc(); if (c == EOF) return false; bool neg = c == '-'; if (neg) c = gc(); while (isdigit(c)) { v = v * 10 + c - '0'; c = gc(); } if (neg) v = -v; return true; } using namespace std; typedef pair<int, int> II; typedef vector<int> VI; typedef vector<II> VII; typedef vector<VI> VVI; typedef vector<VII> VVII; void OPEN(){ freopen("A.in","r",stdin); freopen("A.out","w",stdout); } int test, n, m; int adj[maxn], last[maxn], next[maxn], E, x; int a[maxn], num[maxn]; bool isprime[maxn]; int f[maxn], dad[maxn]; void init(){ memset(isprime, 1, sizeof(isprime)); FOR(i, 2, 1000) if(isprime[i]){ for(int j = i * i ; j < 500000; j += i){ isprime[j] = 0; f[j] = i; } } FOR(i, 2, 500000) if(isprime[i]){ f[i] = i; } } void duyet(int u){ int que[maxn], size = 0; que[size++] = u; rep(i, size){ u = que[i]; for(int e = last[u]; e != -1; e = next[e]){ int v = adj[e]; que[size++] = v; } } FOR(i, 1, n) a[i] = 1; FORD(i, size - 1, 0) { u = que[i]; a[dad[u]] += a[u]; } } long long mu(int x, int a, int modun){ if(a == 0) return 1; long long t = mu(x, a >> 1, modun); if(a & 1) return (((t * t) % modun) * x) % modun; return (t * t) % modun; } int main(){ // OPEN(); clock_t start = clock(); init(); // printf("%d\n", clock() - start); gi(test); while(test--){ gi(m); gi(n); memset(last, -1, sizeof(last)); E = 0; FOR(i, 2, n){ gi(x); adj[E] = i; dad[i] = x; next[E] = last[x]; last[x] = E++; } // printf("%d\n", clock() - start); duyet(1); FOR(i, 1, n - 1) num[i] = 0; // printf("%d\n", clock() - start); FOR(i, 2, n - 1) if(isprime[i]){ int the = n - 1, res = 0; while(the){ num[i] += the / i; the /= i; } } // printf("%d\n", clock() - start); //cout << "ok" << endl; FOR(i, 2, n){ int the = a[i]; while(the != 1 && the != 0){ num[f[the]]--; the /= f[the]; } } // printf("%d\n", clock() - start); long long res = 1; FOR(i, 2, n - 1) if(num[i] > 0){ res = (res * mu(i, num[i], m)) % m; } printf("%lld\n", res); } // printf("%d\n", clock() - start); }
Comments