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[_])

alt

从中观察发现相邻的差值只有2或者4,且大部分时候都是2,于是继续打表查找是4的情况。

alt

继续观察发现相邻的间隔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;
}