信息
- ID
- 3214
- 时间
- 200ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 16
- 已通过
- 3
- 上传者
#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;
}