非常简单的数学题
题目描述
输入格式
第一行一个正整数T,表示有T组询问(T<100)。
后面T行,每行一个正整数n(1<=n<=10^12)。
输出格式
输出T行,表示T组询问的答案。
样例输入
3
5
8
1000000000000
样例输出
8
17
488099925
思路:
找规律,遍历a以下的数,找出对应a底下有多少组log2 k个数,然后进行累加,接着加上在k/2<a<k之间的个数即为答案。
#include<bits/stdc++.h>
using namespace std;
const long long MAXX=1e9+7;
main(){
int t;
cin>>t;
while(t--){
long long int a;
cin>>a;
long long k=2,i=1;
long long ans=0;
for(;k<=a;k*=2,i++){
ans+=(k/2*i);
ans%=MAXX;
}
ans+=(a-k/2)*i;
cout<<ans%MAXX<<endl;
}
}