会做的题

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)

更新了?!

CF1634F Fibonacci Additions

考虑把 \(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;  
}
posted @ 2024-09-02 19:43  ydq1101  阅读(18)  评论(0)    收藏  举报