社区讨论
样例正确,后面错误
AT_abc406_e[ABC406E] Popcount Sum 3参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mdfdk1kr
- 此快照首次捕获于
- 2025/07/23 10:59 8 个月前
- 此快照最后确认于
- 2025/07/23 10:59 8 个月前
CPP
#include<bits/stdc++.h>
#define LL long long
using namespace std;
//_________________________________________________________________________________________________________________________________________
const int N = 100;
const LL MOD = 998244353;
int k, T;
LL c[N][N], n;
void init0(){
for(int i = 1; i <= 69; i++) c[i][0] = 1, c[i][i] = 1;
for(int i = 1; i <= 69; i++){
for(int j = 1; j < i; j++){
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
// printf("%dC%d:%d\n", i, j, c[i][j]);
}
}
}
LL C(int n, int k){
if(k > n || n < 0) return 0;
if(n == 0 && k == 0) return 1;
return c[n][k];
}
vector<int> vis;
LL calc(LL n, int k){
LL ans = 0;
vis.clear();
for(int i = 62; i >= 0; i--){
if(n & (1ll << i)){
for(int j = 0; j < i; j++){
ans = (ans + ((1 << j) % MOD) * C(i - 1, k - 1)) % MOD;
}
for(int j : vis){
ans = (ans + ((1 << j) % MOD) * C(i, k)) % MOD;
}
vis.push_back(i);
k--;
// printf("%d %lld\n", i, ans);
}
}
if(k == 0) ans = (ans + n) % MOD;
return ans;
}
int main(){
init0();
scanf("%d", &T);
while(T--){
scanf("%lld%d", &n, &k);
printf("%lld\n", calc(n, k));
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...