voidsolve(){ cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = n + 1; i <= 2 * n; i++) a[i] = a[i - n]; map<int, int> mp; for (int i = 1; i <= 2 * n; i++) a[i] += a[i - 1], a[i] %= m; int ans = 0; // int sum = 0; //for (int i = 0; i <= 2 * n; i++) cerr << a[i] << " "; // cerr << endl; // deb(0); // for (int i = 0; i <= n - 1; i++) cerr << a[i] << " "; //cerr << endl;
for (int i = 0; i <= n - 1; i++) mp[a[i]]++; ans = mp[0]-1; //deb(ans,mp); for (int i = 1; i <= n - 1; i++) { //deb(i); //for (int j = i; j <= i + n - 1; j++) cerr << a[j] << " "; //cerr << endl; mp[a[i - 1]]--; if (mp[a[i - 1]] == 0) mp.erase(a[i - 1]); mp[a[i + n - 1]]++; ans += mp[a[i]]-1; //deb(ans,mp); } cout << ans << endl; }
E:基环树倍增模板:
给你一个长度为 N 的序列 X ,其中每个元素都介于 1 和 N 之间(含),以及一个长度为 N 的序列 A 。
打印在 A 上执行以下操作 K 次的结果。
int n, m; int a[N]; int x[N]; int st[N][65]; voidsolve(){ cin >> n >> m; for (int i = 1; i <= n; i++) cin >> x[i]; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) st[i][0] = x[i];
for (int j = 1; j <= 60; j++) { for (int i = 1; i <= n; i++) { st[i][j] = st[st[i][j - 1]][j - 1]; } } for (int i = 1; i <= n; i++) { int pos = i; for (int j = 60; j >= 0; j--) { if ((m >> j) & 1) pos = st[pos][j]; } cout << a[pos] << " "; } }
constexpr u64 P = u64(1E18) + 9; //constexpr u64 P = 998244353; using Z = ModInt64<P>; int n, m; int a[N]; int b[N]; Z hsa[N], hsb[N]; random_device rd; mt19937_64 gen(rd()); static int findprime() { int n = gen() % 1000000 + 1e6; if (n % 2 == 0) n++; while (true) { bool ok = 1; for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) { ok = 0; n += 2; break; } } if (ok) return n; } } Z pwn[N]; const ull base = findprime(); void solve() { cin >> n >> m; pwn[0] = (u64)1; for (int i = 1; i <= N - 2; i++) pwn[i] = (pwn[i - 1] * base); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; for (int i = 1; i <= n; i++) { hsa[i] = hsa[i - 1] + pwn[a[i]]; hsb[i] = hsb[i - 1] + pwn[b[i]]; } for (int i = 1; i <= m; i++) { int l1, l2, r1, r2; cin >> l1 >> r1 >> l2 >> r2; if (hsa[r1] - hsa[l1 - 1] == hsb[r2] - hsb[l2 - 1]) cout << "Yes" << endl; else cout << "No" << endl; } }