思路:dp[i], if i&1 dp[i] = dp[i-1];如果i是奇数,在dp[i-1]方案的末尾插1
else dp[i] = dp[i-1]+dp[i/2]; 如果i是偶数,可以由奇数得到,只是在末尾插1,组合数没有增加;也可以由偶数 i>>1 左移一位得到,组合数也没有增加
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 1000001
#define INF 10000000
using namespace std;
//测试函数
int main(){
/*ifstream in ("D:\\钢铁程序员\\程序数据\\043奶牛站队.txt");//从文件读取数据流,省去手动输入的麻烦
if(!in){//读取如果失败
cout << "ERROR" << endl;
}*/
int N;
cin >> N;
int dp[MAX];
long mod = 1000000000;
dp[0] = 1;
dp[1] = 1;
for(int i=2; i<=1000000; i++){
if(i&1)//比i%2 == 1 快很多
dp[i] = dp[i-1];
else{
dp[i] = dp[i-1] + dp[i/2];
dp[i] %= mod;
}
}
cout << dp[N]%mod << endl;
//in.close();//打开文件以后要关闭
return 0;
}