Advertisement
am1x

xorcubes003.cpp

Feb 11th, 2023
958
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <inttypes.h>
  3. #include <assert.h>
  4. #include <vector>
  5.  
  6. typedef uint32_t uint_t;
  7. const uint32_t N = 1U << 16, P = 998244353;
  8.  
  9. static uint32_t cubes[N];
  10. static uint32_t cnts[N];
  11.  
  12. static uint32_t solve(uint32_t n)
  13. {
  14.     if (n <= 2)
  15.         return 0;
  16.  
  17.     uint32_t l = 0;
  18.     for (uint32_t t = n; t; t >>= 1)
  19.         l++;
  20.     l--;
  21.     uint32_t m = 1U << l;
  22.  
  23.     uint64_t res = 0;
  24.     for (uint32_t i = 0; i < m; i++) {
  25.         uint64_t res0 = 0;
  26.         for (uint32_t j = 0; j < i; j++) {
  27.             res0 = (res0 + cubes[j] * (uint64_t) cubes[i ^ j]) % P;
  28.         }
  29.         res = (res + res0 * cubes[i]) % P;
  30.     }
  31.     res = res * 2 * m % P;
  32.  
  33.     if (n == m)
  34.         return res;
  35.  
  36.     uint64_t res1 = 0;
  37.     for (uint32_t i = 0; i < m; i++) {
  38.         for (uint32_t j = 0; j < i; j++) {
  39.             res1 = (res1 + cubes[i ^ m] * (uint64_t) cubes[j ^ m] % P * cubes[i ^ j]) % P;
  40.         }
  41.     }
  42.     res = (res + res1 * 6 * (n - m)) % P;
  43.  
  44.     for (uint32_t i = 0; i < m; i++)
  45.         cnts[i] = 0;
  46.  
  47.     for (uint32_t i = m; i < n; i++) {
  48.         for (uint32_t j = m; j < i; j++) {
  49.             cnts[i ^ j]++;
  50.         }
  51.     }
  52.  
  53.     for (uint32_t a = 0; a < m; a++) {
  54.         if (cnts[a] == 0)
  55.             continue;
  56.         uint64_t res2 = 0;
  57.         for (uint32_t k = 0; k < m; k++) {
  58.             res2 = (res2 + cubes[m ^ k] * (uint64_t) cubes[m ^ a ^ k]) % P;
  59.         }
  60.         res = (res + res2 * cubes[a] % P * cnts[a] * 6) % P;
  61.     }
  62.  
  63.     return (res + solve(n - m)) % P;
  64. }
  65.  
  66.  
  67. int main()
  68. {
  69.     for (uint64_t i = 0; i < N; i++) {
  70.         cubes[i] = (i * i % P) * i % P;
  71.     }
  72.  
  73.     uint32_t n = 0;
  74.     int st = scanf("%u", &n);
  75.     assert (st == 1);
  76.     assert (n < N);
  77.     n++;
  78.  
  79.     uint32_t res = solve(n);
  80.     printf("%u\n", res);
  81.  
  82.     return 0;
  83. }
  84.  
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement