4 条题解
-
1
#include <bits/stdc++.h> using namespace std; using ull = unsigned long long; ull qpow(ull x, ull y){ ull res = 1; while (y){ if (y & 1) res *= x; x *= x; y >>= 1; } return res; } ull C(ull n, int m){ if (n < m) return 0; static ull num[70]; for (int i = 0; i < m; i++) num[i] = n - i; for (int i = 1; i <= m; i++){ int x = i; for (int j = 0; j < m && x > 1; j++){ int g = __gcd(num[j], (ull)x); if (g > 1){ num[j] /= g; x /= g; } } assert(x == 1); } ull res = 1; for (int i = 0; i < m; i++) res *= num[i]; return res; } ull C2[70][70], f[70][2][70]; int m; void init(ull n){ memset(f, 0, sizeof(f)); f[60][0][0] = 1; for (int i = 0; i <= 63; i++) for (int j = 0; j <= i; j++) C2[i][j] = C(i, j); for (int i = 59; i >= 0; i--) for (int p : {0, 1}) for (int j = 0; j <= 63; j++) for (int num = 0; num < 2; num++){ if (!p && num > ((n >> i) & 1)) continue; if (i == 0 && num) continue; int p2 = p || num < ((n >> i) & 1); for (int k = j; k <= 63; k++){ ull cur = k == j ? 1 : (i * (k - j) < 64 ? (1ull * num) << (i * (k - j)) : 0); if (cur) f[i][p2][k] += f[i + 1][p][j] * C2[k][j] * cur; } } } ull n, ans; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> m >> n; if (m < 64){ init(n); ans += f[0][1][m]; } n--; init(n--); for (int j = 0; j <= min(m, 63); j++) ans += C(m, j) * f[0][1][j]; cout << ans; return 0; }
信息
- ID
- 3214
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 15
- 已通过
- 2
- 上传者