标签:
#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;
}
标签:
原文地址:http://blog.csdn.net/driver13/article/details/51362158