C题题解:
首先看到数据范围先想到打表找规律。利用如下程序进行打表.
T = 2000
m=0
a = [2 * i - 2 for i in range(1, T+1)]
prefix = [0] * (T+1)
for i in range(1,T+1):
prefix[i] = prefix[i - 1] + a[i - 1]
sums = set()
for i in range(1, T+1):
for j in range(i + 1, T+1):
sums.add(prefix[j] - prefix[i - 1])
sorted_sums = sorted(sums)
for _ in range(1,T+1):
print(_+1,end=" ")
print(sorted_sums[_])
从中观察发现相邻的差值只有2或者4,且大部分时候都是2,于是继续打表查找是4的情况。
继续观察发现相邻的间隔4的元素他们之间的间隔为1, 3, 7, 15,31等。得出结论在位时他们是上一位加4,其余都是加2.于是便是计算n中有多少个是加4的情况。
ac代码
/*
* @Author: BlaCat
*/
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
int er[128];
void solve(){
int n;
cin>>n;
int w=0;
for(w=0;w<127;w++){
if(er[w+1]-w>n){
break;
}
}
w--;
cout<<2*n+2*w+2<<endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
er[0]=1;
for(int i=1;i<128;i++){
er[i]=er[i-1]*2;
}
while(t--){
solve();
}
return 0;
}