会做的题
CF1717E Madoka and The Best University
妙妙题。
\(\gcd(a,b)=\gcd(a,a+b)=gcd(a,n-c)\)
枚举 \(c\),原式为 \(\sum\operatorname{lcm}(c,\gcd(a,n-c))\),枚举 \(\gcd(a,n-c)=d\),就是 \(\sum\operatorname{lcm(a,d)}\)。
而 \(\gcd(a,n-c)=d\) 的个数就是 \(\gcd(\frac{a}{d},\frac{n-c}{d})=1\) 的个数,即 \(\varphi(\frac{n-c}{d})\)。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 9;
const int N = 2e6 + 100;
int n, p[N], cnt, phi[N];
bool vis[N];
vector<int> g[N];
signed main() {
freopen("qd.in", "r", stdin);
freopen("qd.out", "w", stdout);
cin >> n;
phi[1] = 0;
for (int i = 2; i <= N - 100; i++) {
if (!vis[i]) {
p[++cnt] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= cnt && i * p[j] <= N - 100; j++) {
vis[i * p[j]] = 1;
if (i % p[j] == 0) {
phi[i * p[j]] = p[j] * phi[i];
break;
} else {
phi[i * p[j]] = (p[j] - 1) * phi[i];
}
}
}
int ans = 0;
for (int i = 1; i <= n - 2; i++) {
// for (int j = 1; j <= n - i; j++) {
// if ((n - i) % j == 0) {
for (int k = i * 2; k <= n - 1; k += i) {
int j = n - k;
ans = (ans + i / __gcd(i, j) % mod * j % mod * phi[k / i] % mod) % mod;
}
// }
}
cout << ans << '\n';
return 0;
}
// 枚举 c,gcd(a, b) = gcd(a, a + b) = gcd(a, n - c)
// ans = ∑lcm(c, gcd(a, n - c))
// 枚举 d = gcd(a, n - c) ans = ∑lcm(c, d)
// gcd(a, n - c) = d 的个数是 gcd(a / d, (n - c) / d) = 1 的个数,也就是 phi((n - c) / d)
更新了?!
考虑把 \(a_i\) 减去 \(b_i\),记为 \(c_i\),那么现在的问题就变成了判断 \(c_i\) 是否都是 \(0\)。
想到差分,斐波那契数列满足 \(f_i = f_{i - 1} + f_{i - 2}\),那么不妨让差分数组 \(p_i = f_i - f_{i - 1} - f_{i - 2}\),那么操作就变成了:
op = A
\(p_l\leftarrow p_l+f_1=p_l+1\)
\(p_{r+1}\leftarrow p_{r+1}-f_{r-l}-f_{r-l+1}=p_{r+1}-f_{r-l+2}\)
\(p_{r+2}\leftarrow p_{r+2}-f_{r-l-1}-f_{r-l}=p_{r+1}-f_{r-l+1}\)
op = B
\(p_l\leftarrow p_l-f_1=p_l-1\)
\(p_{r+1}\leftarrow p_{r+1}+f_{r-l}+f_{r-l+1}=p_{r+1}+f_{r-l+2}\)
\(p_{r+2}\leftarrow p_{r+2}+f_{r-l-1}+f_{r-l}=p_{r+1}+f_{r-l+1}\)
在线维护 \(p_i=0\) 的数量的大小即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 100;
int n, q, mod, a[N], b[N], f[N], cnt;
inline void change(int x, int k) {
if (x > n) {
return ;
}
cnt -= (a[x] == 0);
a[x] = ((a[x] + k) % mod + mod) % mod;
cnt += (a[x] == 0);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> q >> mod;
f[1] = f[2] = 1;
for (int i = 3; i < N; i++) {
f[i] = (f[i - 1] + f[i - 2]) % mod;
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
a[i] = (a[i] - b[i] + mod) % mod;
}
for (int i = n; i >= 2; i--) {
a[i] = (a[i] - a[i - 1] + mod - a[i - 2] + mod) % mod;
cnt += (a[i] == 0);
}
cnt += (a[1] == 0);
for (int i = 1; i <= q; i++) {
char op;
int x, y;
cin >> op >> x >> y;
if (op == 'A') {
change(x, 1);
change(y + 1, -f[y - x + 2]);
change(y + 2, -f[y - x + 1]);
} else {
change(x, -1);
change(y + 1, f[y - x + 2]);
change(y + 2, f[y - x + 1]);
}
cout << (cnt == n ? "YES" : "NO") << '\n';
}
return 0;
}

浙公网安备 33010602011771号