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 = 2 * 100000;
  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(35);
  29. for (int x = 1; x <= n; x++) {
  30. int bits = 0, y = x;
  31. while (y) {
  32. bits++;
  33. y >>= 1;
  34. }
  35. cnt[bits]++;
  36. }
  37.  
  38. vector<vector<long long>> combs(35, vector<long long>(1, 1));
  39. for (int b = 0; b < 35; b++) {
  40. int mx = cnt[b];
  41. long long ncr = 1, cur = 1;
  42. for (int k = 1; k <= mx; k++) {
  43. ncr = (mx - k + 1) * ncr % MOD;
  44. ncr = inv[k] * ncr % MOD;
  45. cur = (cur + ncr) % MOD;
  46. combs[b].push_back(cur);
  47. }
  48. }
  49.  
  50. long long ans = 0;
  51. for (int b = 0; b < 35; b++) {
  52. int mx = cnt[b];
  53. for (int v = 1; v <= mx; v++) {
  54. long long c = (combs[b][v] - combs[b][v - 1] + MOD) % MOD;
  55. for (int bb = 0; bb < 35; bb++) {
  56. if (bb == b) continue;
  57. if (bb < b) c *= combs[bb][min(cnt[bb], v - 1)];
  58. else c *= combs[bb][min(cnt[bb], v)];
  59. c %= MOD;
  60. }
  61. ans += c * v;
  62. ans %= MOD;
  63. }
  64. }
  65. cout << ans << '\n';
  66. }
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0.03s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty