hdu 6304 Chiaki Sequence Revisited

 

 

0的時候連續0的長度爲

1 2  1 3  1 2  1 4  1 2  1 3  1 2  1 5…….

其規律是前2^i項由前2^(i-1)的數,複製一遍,並將第2^i項的數+1

次數爲i次的數的首相是2^(i-1),公差是2^i,枚舉出現的次數,就可以算出最終答案

 

代碼總是錯,最後參考了一下網上的大佬

#include<cstdio>
#include<iostream>
using namespace std;
#define mod 1000000007
typedef long long ll;
ll a[105],f[105];
int main()
{
    ll T;
    scanf("%lld",&T);
    a[0]=f[0]=1;
    for(ll i=1;i<=62;i++)a[i]=a[i-1]*2+1,f[i]=f[i-1]*2;
    while(T--)
    {
        ll pos=0,n,m,ma=-1,ans=0;
        scanf("%lld",&n);
        m=n;
        for(ll i=62;i>=0;i--)
            if(m-a[i]>=0) {
                m -= a[i];
                pos = pos + (1ll << i);
            }
        pos+=(m>0);
        ll now=pos-1,num=0;
        for(ll i=1;f[i-1]<=now;i++)
        {
            ll s=f[i-1],step=(now-s)/f[i]+1,e=(step-1)*f[i]+s;
            ll haha=(s+e)%mod*(step%mod)%mod*((mod+1)/2)%mod;
            ans=(ans+haha*i%mod)%mod;
            num+=step*i;
        }
        ans=(ans+1+(n-num-1)%mod*(pos%mod)%mod)%mod;
        printf("%lld\n",ans);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章