hdu 6304 数学题+找规律+卡时间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanbaobao829/article/details/82253501
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ans,sum,inv2=500000004;
ll cal(ll n)
{
    sum=0;
    while(n)
    {
        sum+=n;
        n>>=1;
    }
    return sum;
}
void calc(ll n)
{
    ll tp=1;
    sum=ans=0;
    while(n)
    {
        sum+=n;
        ans=(ans+n%mod*((n+1)%mod)%mod*inv2%mod*tp%mod)%mod;
        tp=tp*2%mod;
        n>>=1;
    }
}
int main()
{
    ll t,n;
    scanf("%lld",&t);
    while(t--&&scanf("%lld",&n)!=EOF)
    {
        sum=ans=0;
        ll l=1,r=n;
        while(l<r)
        {
            ll mid=(l+r)/2;
            if(cal(mid)>=n-1)
                r=mid;
            else
                l=mid+1;
        }
        calc(l);
        printf("%lld\n",((ans-(sum-n+1)%mod*(l%mod)%mod)%mod+mod+1)%mod);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/fanbaobao829/article/details/82253501
今日推荐