【题目链接】click here~~
【题目大意】
在机房点击bnu的oj,发现首页推荐了这道题,点进去一看,原来是道数学题,好久没怎么做做数学的题了,于是就做了
其实之前一直做过类似的题,感觉是要推规律,下面给出代码
//方法一:直接模拟 times:1000ms
#include <iostream> #include <bits/stdc++.h> using namespace std; const int mod=1e7; const int maxn=3000000; long long sum[maxn+10]; int main() { int i,j; sum[0]=1,sum[1]=sum[2]=2,sum[3]=4; int res=4; for(i=4;i<=maxn;)//第i行奇数个数 { for(j=0;j<res&&i<=maxn;i++,j++) sum[i]=sum[j]*2; res*=2; } for(i=0; i<=maxn; i++)//第i行偶数个数 sum[i]=i+1-sum[i]; for(i=1; i<=maxn; i++) //前i行偶数个数 sum[i]=(sum[i]+sum[i-1])%mod; long long n; while(cin>>n) { printf("%lld\n",sum[n]); } return 0; } /*1 --0 1 1 1 --1 2 1 2 1 --2 2 1 3 3 1 --3 4 1 4 6 4 1 --4 2 1 5 10 10 5 1 --5 6 1 6 15 20 15 6 1 --6 9 1 7 21 35 35 21 7 1 --7 9 */
/* 第n行里面奇数的个数等于2^K 个, k等于n二进制数里面1的个数。 */ #include <iostream> #include <bits/stdc++.h> using namespace std; const int mod=1e7; const int maxn=3000000; long long sum[maxn+10]; int solve(int n)//n二进制数里面1的个数 { int s=0; while(n!=0){ if(n%2==1) s++; n/=2; } return s; } void init() { int i,j; for(i=0;i<maxn;i++){ sum[i]=i+1; //第i行总共有多少元素 sum[i]=sum[i]-(1<<solve(i));//第i行偶数个数 } for(i=1;i<maxn;i++) sum[i]=(sum[i]+sum[i-1])%mod; } int main() { int n; init(); scanf("%lld",&n); printf("%lld\n",sum[n]); return 0; }
#include <iostream> #include <bits/stdc++.h> using namespace std; const int mod=1e7; const int maxn=3000000; long long sum[maxn+10]; int main() { long long s=0,ans; int n,t; scanf("%d",&n); while(n>=0) { t=n; ans=1; while(t) { if(t%2==1) ans*=2; t/=2; } s+=n+1-ans; n--; } printf("%lld\n",s%mod); return 0; }
原文地址:http://blog.csdn.net/u013050857/article/details/45012291