码迷,mamicode.com
首页 > 其他好文 > 详细

ceshi

时间:2016-05-12 14:04:04      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<iostream>
#define maxn 2009
#include<string.h>
#define mod 1000000007
using namespace std;
long long a,sum[maxn];

int main()
{
    freopen("in.txt","r",stdin);
    freopen("out2.txt","w",stdout);
    long long cnt[60];
    cnt[0]=1;
    for(int i=1;i<=50;i++)
    {
        cnt[i]=2*cnt[i-1];
    }
    while(~scanf("%lld",&a))
    {
        memset(sum,0,sizeof(sum));
        long long p=0;
        while(a)
        {
            long long temp=a;
            long long ans=0;
            for(int i=50;i>=0;i--)
            {
                if(temp/cnt[i]>0)
                {
                    temp-=cnt[i];
                    ans++;
                }
            }
            //printf("a=%lld ans=%lld\n",a,ans);
            sum[ans]++;
            for(int i=1;i<ans;i++)
                p+=sum[i];
            a--;
        }
        printf("%lld\n",p%mod);
    }
    return 0;
}


#include<stdio.h>
#include<iostream>
#define maxn 2009
#include<string.h>
#define mod 1000000007
using namespace std;
char s[maxn];
long long dp[maxn][maxn],o[maxn][maxn],sum[maxn],ans1=0,ans2=0,ans=0,fu[maxn][maxn][2];

int main()
{
    //freopen("d://in.txt","r",stdin);
    while(~scanf("%s",s)){
    memset(dp,0,sizeof(dp));
     memset(sum,0,sizeof(sum));
     ans1=0;
    int len=strlen(s);
    int num[maxn];
    for(int i=1;i<=len;i++)
        num[i]=s[len-i]-'0';
    int t[4005];
    int en=4000,i=0;
    while(1)
    {
        int k1=0;
        for(int j=len;j>=1;j--)
        {
            if(k1)
            {
                if(num[j]%2)
                   k1=1;
                else
                   k1=0;
                num[j]=(10+num[j])/2;
            }
            else
            {
                if(num[j]%2)
                    k1=1;
                else
                    k1=0;
                num[j]=num[j]/2;
            }
        }
        if(k1)
            t[4000-i]=1;
        else
            t[4000-i]=0;
        bool flag=false;
        for(int j=len;j>=1;j--)
        {
            if(num[j])
            {
                flag=true;
                break;
            }
        }
        if(flag)
            i++;
        else
             break;
    }
    memset(fu,0,sizeof(fu));
    memset(o,0,sizeof(o));
    o[1][1]=1;
    sum[1]=1;
    int cal[maxn],p=i;
    sum[1]=2;
    sum[2]=3;
    for(int j=2;j<=p+1;j++)
        sum[j]=3;
    o[2][1]=1;
    o[2][2]=1;
    fu[2][1][0]=1;
    long long pre=0,pp=0;
    ans1=0;
    for(int j=3;j<=p;j++)
    {
        pre=0;
        pp=0;
        for(int l=p;l>=0;l--)
		{
		    long long x=o[j-1][l-1];
		    long long xx=o[j-1][l];
            o[j][l]=(x+xx)%mod;
            pp=(pp+o[j][l])%mod;
            if(l>1)
            {
                fu[j][l][0]=(fu[j-1][l][0]*2+fu[j-1][l+1][0]+fu[j-1][l-1][0])%mod;
                fu[j][l][1]=(fu[j-1][l][1]*2+fu[j-1][l+1][1]+fu[j-1][l-1][1])%mod;
                pre=(pre+fu[j][l][1])%mod;
            }
            else if(l==0)
            {
                fu[j][0][0]=(fu[j-1][1][0]+fu[j-1][0][0]*2+fu[j-1][1][1])%mod;
            }
            else
            {
                fu[j][1][1]=(fu[j-1][1][1]*2+fu[j-1][2][1]+fu[j-1][0][0])%mod;
                fu[j][1][0]=(fu[j-1][0][0]+fu[j-1][1][0]*2+fu[j-1][2][0])%mod;
                pre=(pre+fu[j][l][1])%mod;
            }
            ans1=(ans1+1LL*(sum[p+1]-sum[l])*o[j][l]%mod)%mod;
		}
		fu[j][1][0]=(pp/2+fu[j][1][0])%mod;
		ans1=(ans1+pre)%mod;
		long long aa=o[j][1];
		aa%=mod;
		sum[1]=sum[1]+aa;
		for(int h=2;h<=p+1;h++)
        {
            aa=(aa+o[j][h])%mod;
            sum[h]=(aa+sum[h])%mod;
        }
    }
   // printf("ans1=%lld\n",ans1);
    memset(fu,0,sizeof(fu));
    for(i=1;i<=p+1;i++)
        cal[i]=t[4000-p+i-1];
    memset(dp,0,sizeof(dp));
    int kk=2;
    pre=0,pp=0;
    int hh=2;
    while(!cal[hh]&&hh<=p+1)
        hh++;
    if(hh==p+2&&cal[hh-1]==0)
        dp[hh-1][1]=1;
    else
    {
        dp[hh][1]=1;
        dp[hh][2]=1;
        fu[hh][1][0]=1;
    }
   // printf("pre=%d\n",hh);
    for(int j=hh+1;j<=p+1;j++)
    {
        pre=0;
        pp=0;
        for(int l=p+1;l>=0;l--)
        {
            long long x=dp[j-1][l-1];
            long long xx=dp[j-1][l];
        	dp[j][l]=(x+xx)%mod;
        	pp=(pp+dp[j][l])%mod;
        	if(l>1)
            {
                fu[j][l][0]=(fu[j-1][l][0]*2+fu[j-1][l+1][0]+fu[j-1][l-1][0])%mod;
                fu[j][l][1]=(fu[j-1][l][1]*2+fu[j-1][l+1][1]+fu[j-1][l-1][1])%mod;
                pre=(pre+fu[j][l][1])%mod;
            }
            else if(l==0)
            {
                fu[j][0][0]=(fu[j-1][1][0]+fu[j-1][0][0]*2+fu[j-1][1][1])%mod;
            }
            else
            {
                fu[j][1][1]=(fu[j-1][1][1]*2+fu[j-1][2][1]+fu[j-1][0][0])%mod;
                fu[j][1][0]=(fu[j-1][0][0]+fu[j-1][1][0]*2+fu[j-1][2][0])%mod;
                pre=(pre+fu[j][l][1])%mod;
            }
        }
        if(cal[j]==0)
        {
           dp[j][kk+1]--;
           fu[j][1][0]=(pp/2+fu[j][1][0])%mod;
           for(int l=p+1;l>kk+1;l--)
           {

               fu[j][l-(kk+1)][1]=(fu[j][l-(kk+1)][1]-dp[j][l]+mod)%mod;
               pre=(pre-dp[j][l]+mod)%mod;
           }
           for(int l=kk+1;l>=0;l--)
           {
               fu[j][kk+1-l][0]=(fu[j][kk+1-l][0]-dp[j][l]+mod)%mod;
           }
        }
       	else
        {
            fu[j][1][0]=(pp/2+fu[j][1][0])%mod;
            kk++;
        }
    }
    for(int j=1;j<=p+1;j++)
    {
       // printf("dp[%d][%d]=%lld\n",p+1,j,dp[p+1][j]);
        pre=(pre+1LL*(sum[p+1]-sum[j])*dp[p+1][j]%mod)%mod;
    }
    if(p+1>=3)
        printf("%lld\n",((ans1+pre)%mod+mod)%mod);
    else
        printf("0\n");
    }
    return 0;
}


ceshi

标签:

原文地址:http://blog.csdn.net/driver13/article/details/51362158

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!