补题链接:Here

A - Number of Multiples

水题

B - An Odd Problem

水题

C - XYZ Triplets

水题,注意数组不要开小了

D - Anything Goes to Zero

这道题思路很妙:

首先计算出字符串中所有 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图1 的数量 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图2 ,然后分三种情况:

  1. AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图3 此时我们不难发现对每一位的变化,模数要么为 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图4,要么为 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图5 ,那么我们就可以先按原字符串把两种情况先算出,在计算每一位时进行加减即可,对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图6 位,只需要加上 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图7 再对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图8 再对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图9 位,只需要减去 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图10 (注意负数取模)再对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图11 (注意负数取模)再对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图12 为下标。
  2. AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图13 此时不难发现就一个 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图14 ,那么模数就只能为 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图15 ,也即 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图16 位的变化和计算和上面一样,但对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图17 位的变化和计算和上面一样,但对 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图18 ,直接输出 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图19 即可
  3. AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图20 最简单的一种情况,全部输出 AIsing Programming Contest 2020 游记 (ABC水题,D思维) - 图21 即可
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll power(ll a, ll b, ll mod) { return b ? power(a * a % mod, b / 2, mod) * (b % 2 ? a : 1) % mod : 1; }
  5. ll cal(ll n) {
  6. ll cnt = 1;
  7. while (n) {
  8. n = n % __builtin_popcount(n);
  9. cnt++;
  10. }
  11. return cnt;
  12. }
  13. int main() {
  14. ll n, cnt = 0, ans1 = 0, ans2 = 0, ans;
  15. string s;
  16. cin >> n >> s;
  17. for (int i = 0; i < n; i++) {
  18. if (s[i] == '1') cnt++;
  19. }
  20. if (cnt > 1) {
  21. for (ll i = 0; i < n; i++) {
  22. if (s[i] == '1') ans1 = (ans1 + power(2, n - i - 1, cnt - 1)) % (cnt - 1), ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1);
  23. }
  24. for (ll i = 0; i < n; i++) {
  25. if (s[i] == '0') {
  26. ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1);
  27. cout << cal(ans) << endl;
  28. } else {
  29. ans = (ans1 + ((cnt - 1) - power(2, n - i - 1, cnt - 1) % (cnt - 1)) % (cnt - 1)) % (cnt - 1);
  30. cout << cal(ans) << endl;
  31. }
  32. }
  33. } else if (cnt == 1) {
  34. for (int i = 0; i < n; i++)
  35. if (s[i] == '1') ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1);
  36. for (ll i = 0; i < n; i++) {
  37. if (s[i] == '0') {
  38. ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1);
  39. cout << cal(ans) << endl;
  40. } else {
  41. cout << 0 << endl;
  42. }
  43. }
  44. } else
  45. for (int i = 0; i < n; i++) cout << 1 << endl;
  46. return 0;
  47. }