比赛链接:Here

AB水题,

C - Sum of gcd of Tuples (Easy)

题意:AtCoder Beginner Contest 162 C~F - 图1#card=math&code=%5Csum%7Ba%3D1%7D%5E%7BK%7D%20%5Csum%7Bb%3D1%7D%5E%7BK%7D%20%5Csum_%7Bc%3D1%7D%5E%7BK%7D%20g%20c%20d%28a%2C%20b%2C%20c%29)

数据范围:AtCoder Beginner Contest 162 C~F - 图2

思路:因为 AtCoder Beginner Contest 162 C~F - 图3 比较小,我们直接跑暴力即可

  1. int main() {
  2. ios::sync_with_stdio(false), cin.tie(nullptr);
  3. ll n; cin >> n;
  4. ll ans = 0;
  5. for (int i = 1; i <= n; i++)
  6. for (int j = 1; j <= n; j++)
  7. for (int k = 1; k <= n; k++)
  8. ans += __gcd(__gcd(i, j), k);
  9. cout << ans;
  10. }

D - RGB Triplets

题意:给一个长度为N的字符串S,只包含’R’,’B’,’G’。求有多少个三元组 AtCoder Beginner Contest 162 C~F - 图4(1%5Cle%20i%3Cj%3Ck%5Cle%20N)#card=math&code=%28i%2Cj%2Ck%29%281%5Cle%20i%3Cj%3Ck%5Cle%20N%29) 满足 AtCoder Beginner Contest 162 C~F - 图5

数据范围:AtCoder Beginner Contest 162 C~F - 图6

题解:先将满足 AtCoder Beginner Contest 162 C~F - 图7 的算出来,在减去 AtCoder Beginner Contest 162 C~F - 图8 的数目。

总的显然等于 AtCoder Beginner Contest 162 C~F - 图9num(B)num(G)#card=math&code=num%28R%29%2Anum%28B%29%2Anum%28G%29) ,然后枚举两个端点,判断第三个端点是不是不同于这个两个端点的颜色。

  1. const int N = 4e3 + 5;
  2. int main() {
  3. ios::sync_with_stdio(false), cin.tie(nullptr);
  4. int n; string s;
  5. cin >> n >> s;
  6. int a = 0, b = 0, c = 0;
  7. for (int i = 0; i < n; ++i) {
  8. if (s[i] == 'R') a += 1;
  9. if (s[i] == 'G') b += 1;
  10. if (s[i] == 'B') c += 1;
  11. }
  12. ll ans = 1ll * a * b * c;
  13. for (int i = 0; i < n; i++)
  14. for (int j = i + 1; j < n; j++) {
  15. if (s[i] == s[j]) continue;
  16. if (2 * j - i < n && s[i] != s[2 * j - i] && s[j] != s[2 * j - i]) ans--;
  17. }
  18. cout << ans;
  19. }

E - Sum of gcd of Tuples (Hard)

题意:AtCoder Beginner Contest 162 C~F - 图10(%5Cbmod%201%20%5Cmathrm%7Be%7D%209%2B7)#card=math&code=%5Csum%7Ba%7B1%7D%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7BK%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7BK%7D%20g%20c%20d%5Cleft%28a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a_%7BN%7D%5Cright%29%28%5Cbmod%201%20%5Cmathrm%7Be%7D%209%2B7%29)

数据范围:AtCoder Beginner Contest 162 C~F - 图11

思路一:莫比乌斯反演化简

AtCoder Beginner Contest 162 C~F - 图12%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7BK%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7BK%7D%20i%5Cleft%5B%5Coperatorname%7Bgcd%7D%5Cleft(a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a%7BN%7D%5Cright)%3D%3Di%5Cright%5D%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20i%5Cleft%5B%5Coperatorname%7Bgcd%7D%5Cleft(a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a%7BN%7D%5Cright)%3D%3D1%5Cright%5D%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cmu(d)%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%7B1%7D%7D%5Cright%5Crfloor%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%7B2%7D%7D%5Cright%5Crfloor%20%5Cldots%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%20N%7D%5Cright%5Crfloor%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7B%5Cimath%7D%5Cright%5Crfloor%7D%20%5Cmu(d)%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%202%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%20N%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%201%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cmu(d)%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%5E%7BN%7D%20%5C%5C%0A%3D%5Csum%7BT%3D1%7D%5E%7BK%7D%5Cleft%5Clfloor%5Cfrac%7BK%7D%7BT%7D%5Cright%5Crfloor%5E%7BN%7D%20%5Csum%7Bd%20%5Cmid%20T%7D%20%5Cmu(d)%20*%5Cleft%5Clfloor%5Cfrac%7BT%7D%7Bd%7D%5Cright%5Crfloor(T%3Di%20d)%20%5C%5C%0A%3D%5Csum%7BT%3D1%7D%5E%7BK%7D%5Cleft%5Clfloor%5Cfrac%7BK%7D%7BT%7D%5Cright%5Crfloor%5E%7BN%7D%20%5Cphi(T)%0A%5Cend%7Barray%7D%0A#card=math&code=%5Cbegin%7Barray%7D%7Bl%7D%0AA%20n%20s%3D%5Csum%7Ba%7B1%7D%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7BK%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7BK%7D%20g%20c%20d%5Cleft%28a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a%7BN%7D%5Cright%29%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7BK%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7BK%7D%20i%5Cleft%5B%5Coperatorname%7Bgcd%7D%5Cleft%28a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a%7BN%7D%5Cright%29%3D%3Di%5Cright%5D%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20i%5Cleft%5B%5Coperatorname%7Bgcd%7D%5Cleft%28a%7B1%7D%2C%20a%7B2%7D%2C%20%5Cldots%2C%20a%7BN%7D%5Cright%29%3D%3D1%5Cright%5D%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%7B2%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%7BN%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cmu%28d%29%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%7B1%7D%7D%5Cright%5Crfloor%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%7B2%7D%7D%5Cright%5Crfloor%20%5Cldots%5Cleft%5Clfloor%5Cfrac%7Bd%7D%7Ba%20N%7D%5Cright%5Crfloor%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7B%5Cimath%7D%5Cright%5Crfloor%7D%20%5Cmu%28d%29%20%5Csum%7Ba%7B1%7D%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%20%5Csum%7Ba%202%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%20%5Cldots%20%5Csum%7Ba%20N%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%7D%201%20%5C%5C%0A%3D%5Csum%7Bi%3D1%7D%5E%7BK%7D%20i%20%5Csum%7Bd%3D1%7D%5E%7B%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%7D%5Cright%5Crfloor%7D%20%5Cmu%28d%29%5Cleft%5Clfloor%5Cfrac%7BK%7D%7Bi%20d%7D%5Cright%5Crfloor%5E%7BN%7D%20%5C%5C%0A%3D%5Csum%7BT%3D1%7D%5E%7BK%7D%5Cleft%5Clfloor%5Cfrac%7BK%7D%7BT%7D%5Cright%5Crfloor%5E%7BN%7D%20%5Csum%7Bd%20%5Cmid%20T%7D%20%5Cmu%28d%29%20%2A%5Cleft%5Clfloor%5Cfrac%7BT%7D%7Bd%7D%5Cright%5Crfloor%28T%3Di%20d%29%20%5C%5C%0A%3D%5Csum_%7BT%3D1%7D%5E%7BK%7D%5Cleft%5Clfloor%5Cfrac%7BK%7D%7BT%7D%5Cright%5Crfloor%5E%7BN%7D%20%5Cphi%28T%29%0A%5Cend%7Barray%7D%0A)

由于 AtCoder Beginner Contest 162 C~F - 图13 不大,预处理欧拉函数,直接遍历即可。AtCoder Beginner Contest 162 C~F - 图14 大的话,整除分块加杜教筛(雾。

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4. const int N = 1e5 + 5, MD = 1e9 + 7;
  5. int pri[N], tot, phi[N];
  6. bool p[N];
  7. void init() {
  8. p[1] = true, phi[1] = 1;
  9. for (int i = 2; i < N; i++) {
  10. if (!p[i]) pri[++tot] = i, phi[i] = i - 1;
  11. for (int j = 1; j <= tot && i * pri[j] < N; j++) {
  12. p[i * pri[j]] = true;
  13. if (i % pri[j] == 0) {
  14. phi[i * pri[j]] = phi[i] * pri[j];
  15. break;
  16. } else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
  17. }
  18. }
  19. }
  20. ll qpow(ll a, ll b) {
  21. ll ans = 1;
  22. for (; b; b >>= 1, a = a * a % MD) if (b & 1) ans = ans * a % MD;
  23. return ans;
  24. }
  25. void add(int &x, int y) { x += y; if (x >= MD) x -= MD;}
  26. int main() {
  27. ios::sync_with_stdio(false), cin.tie(nullptr);
  28. init();
  29. int n, k, ans = 0;
  30. cin >> n >> k;
  31. for (int i = 1; i <= k; i++)
  32. add(ans, 1LL * qpow(k / i, n)*phi[i] % MD);
  33. cout << ans;
  34. }

思路二:

学习了下官方题解:定义 AtCoder Beginner Contest 162 C~F - 图15 代表 AtCoder Beginner Contest 162 C~F - 图16AtCoder Beginner Contest 162 C~F - 图17 的个数,递推关系式:AtCoder Beginner Contest 162 C~F - 图18

双重循环即可,里面那层循环的复杂度总和是个调和级数,AtCoder Beginner Contest 162 C~F - 图19 级别的。

  1. const int N = 1e5 + 5, MD = 1e9 + 7;
  2. int f[N];
  3. ll qpow(ll a, ll b) {
  4. ll ans = 1;
  5. for (; b; b >>= 1, a = a * a % MD) if (b & 1) ans = ans * a % MD;
  6. return ans;
  7. }
  8. void add(int &x, int y) {
  9. x += y;
  10. if (x >= MD) x -= MD;
  11. if (x < 0) x += MD;
  12. }
  13. int main() {
  14. ios::sync_with_stdio(false), cin.tie(nullptr);
  15. int n, k;
  16. scanf("%d%d", &n, &k);
  17. cin >> n >> k;
  18. for (int i = k; i >= 1; i--) {
  19. f[i] = qpow(k / i, n);
  20. for (int j = 2 * i; j <= k; j += i)
  21. add(f[i], -f[j]);
  22. }
  23. int ans = 0;
  24. for (int i = 1; i <= k; i++)
  25. add(ans, 1LL * f[i]*i % MD);
  26. cout << ans;
  27. }

F - Select Half

题意:给一个长度为 AtCoder Beginner Contest 162 C~F - 图20 的序列 AtCoder Beginner Contest 162 C~F - 图21,要求选 AtCoder Beginner Contest 162 C~F - 图22 个数,且下标互不相邻,最大化它们的总和。

数据范围:AtCoder Beginner Contest 162 C~F - 图23

题解:对于选的数的下标, AtCoder Beginner Contest 162 C~F - 图24,可以发现 AtCoder Beginner Contest 162 C~F - 图25

因此定义 AtCoder Beginner Contest 162 C~F - 图26 代表选第 AtCoder Beginner Contest 162 C~F - 图27 里面的数(必选第个 AtCoder Beginner Contest 162 C~F - 图28 数),前面多空了 AtCoder Beginner Contest 162 C~F - 图29 的最大值。

AtCoder Beginner Contest 162 C~F - 图30%2Ba%5Bi%5D%20%5C%5C%0Af%5Bi%5D%5B2%5D%20%26%3D%5Cmax%20(f%5Bi-2%5D%5B2%5D%2C%20f%5Bi-3%5D%5B1%5D%2C%20f%5Bi-4%5D%5B0%5D)%2Ba%5Bi%5D%0A%5Cend%7Baligned%7D%5Cright.%0A#card=math&code=%5Cleft%5C%7B%5Cbegin%7Baligned%7D%0Af%5Bi%5D%5B0%5D%20%26%3Df%5Bi-2%5D%5B0%5D%2Ba%5Bi%5D%20%5C%5C%0Af%5Bi%5D%5B1%5D%20%26%3D%5Cmax%20%28f%5Bi-2%5D%5B1%5D%2C%20f%5Bi-3%5D%5B0%5D%29%2Ba%5Bi%5D%20%5C%5C%0Af%5Bi%5D%5B2%5D%20%26%3D%5Cmax%20%28f%5Bi-2%5D%5B2%5D%2C%20f%5Bi-3%5D%5B1%5D%2C%20f%5Bi-4%5D%5B0%5D%29%2Ba%5Bi%5D%0A%5Cend%7Baligned%7D%5Cright.%0A)

  1. const int N = 2e5 + 5;
  2. int a[N];
  3. ll f[N][3];
  4. int main() {
  5. ios::sync_with_stdio(false), cin.tie(nullptr);
  6. int n; cin >> n;
  7. for (int i = 1; i <= n; ++i) cin >> a[i];
  8. for (int i = 1; i <= n; i++)
  9. for (int j = 0; j < 3; j++)
  10. f[i][j] = -1e18;
  11. for (int i = 1; i <= 3; i++)
  12. f[i][i - 1] = a[i];
  13. f[3][0] = a[1] + a[3];
  14. for (int i = 4; i <= n; i++) {
  15. f[i][0] = f[i - 2][0] + a[i];
  16. f[i][1] = max(f[i - 2][1], f[i - 3][0]) + a[i];
  17. f[i][2] = max(f[i - 2][2], f[i - 3][1]) + a[i];
  18. if (i > 4) f[i][2] = max(f[i][2], f[i - 4][0] + a[i]);
  19. }
  20. ll ans;
  21. if (n & 1) ans = max(f[n][2], max(f[n - 1][1], f[n - 2][0]));
  22. else
  23. ans = max(f[n][1], f[n - 1][0]);
  24. cout << ans;
  25. }