标签:
#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