题解:P12147 【MX-X11-T1】「蓬莱人形 Round 1」仅此而已,就已经足够了
fish_love_cat · · 题解
偶遇数学题拼尽全力无法战胜,怎么会是呢。
调了三天甚至两天,耶耶耶。
观察到增加一个
注意到
注意到第
于是不妨
然后贡献大小就是
直接写就行,请务必保持头脑清楚以及明确每一行的作用!
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n,k;
cin>>n>>k;
int ans=(1<<k)*(n+1);
n+=(1<<k);
// cout<<n<<"! ";
for(int i=1<<(k+1);i<=n;i*=2){
// cout<<ans<<' ';
int f=n/(i<<1);
int c=min(1ll<<k,n%i+1);
int sum=f*(1<<k);
ans+=sum*i*2-sum*(1<<(k+1));
// cout<<c<<' ';
if(n&i)ans+=i*c*2-c*(1<<(k+1));
}
cout<<ans<<'\n';
}
/*
0
1
10
11
100
101
110
*/
signed main(){
int t;
cin>>t;
while(t--)solve();
return 0;
}
/*
72
272
50
18
4
9 2
17 3
8 1
4 1
*/