fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const long long MOD = 998244353;
  5.  
  6. long long finv(long long x) {
  7. long long p = MOD - 2;
  8. long long inv = 1;
  9. while (p) {
  10. if (p & 1) inv = inv * x % MOD;
  11. x = x * x % MOD;
  12. p >>= 1;
  13. }
  14. return inv;
  15. }
  16.  
  17. int main() {
  18. const int lim = 200000;
  19. vector<long long> inv(lim + 1, 1);
  20. for (int i = 2; i <= lim; i++) inv[i] = finv(i);
  21.  
  22. int t;
  23. cin >> t;
  24. while (t) {
  25. t--;
  26. int n;
  27. cin >> n;
  28. vector<int> cnt(20);
  29. for (int x = 1; x <= n; x++) {
  30. int bits = 32 - __builtin_clz(x);
  31. cnt[bits]++;
  32. }
  33.  
  34. vector<vector<long long>> combs(20, vector<long long>(1, 1));
  35. for (int b = 0; b < 20; b++) {
  36. int mx = cnt[b];
  37. long long ncr = 1, cur = 1;
  38. for (int k = 1; k <= mx; k++) {
  39. ncr = (mx - k + 1) * ncr % MOD;
  40. ncr = inv[k] * ncr % MOD;
  41. cur = (cur + ncr) % MOD;
  42. combs[b].push_back(cur);
  43. }
  44. }
  45.  
  46. long long ans = 0;
  47. for (int b = 0; b < 20; b++) {
  48. int mx = cnt[b];
  49. for (int v = 1; v <= mx; v++) {
  50. long long c = (combs[b][v] - combs[b][v - 1] + MOD) % MOD;
  51. for (int bb = 0; bb < 20; bb++) {
  52. if (bb == b) continue;
  53. if (bb < b) c *= combs[bb][min(cnt[bb], v - 1)];
  54. else c *= combs[bb][min(cnt[bb], v)];
  55. c %= MOD;
  56. }
  57. ans += c * v;
  58. ans %= MOD;
  59. }
  60. }
  61. cout << ans << '\n';
  62. }
  63. return 0;
  64. }
  65.  
Success #stdin #stdout 0.03s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty