Xor Sum

传送门:

https://abc050.contest.atcoder.jp/tasks/arc066_b

怎么说呢

这题一上来就只会头铁地硬算...

首先打表,可以发现前几项有:1、2、4、5、8、10、13、14、18、21、26、28、33、36、40、41、46、50、57、60、68

可以发现:left{egin{matrix}a_{2k}=2a_{k-1}+a_k  a_{2k+1}=2a_k+a_{k-1} end{matrix}
ight.

因此直接用数组记录前面已有的项目,再开一个 map 用于记忆化搜索,然后递归即可。

这就是莽夫解法了...

然后正解请参见:https://blog.csdn.net/axuhongbo/article/details/79169565?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158918292419724839261409%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=158918292419724839261409&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-79169565.nonecase&utm_term=Xor+Sum+dp

我还没看懂...等我想明白了再补上题解...

#include <map>
#include <iostream>
using namespace std;
#define ll long long
const int mod=1e9+7;
map<ll,ll> f;
ll Dp(ll x){
    if(f[x]) return f[x];
    return (f[x]=(Dp(x/2)+Dp((x-1)/2)+Dp((x-2)/2))%mod);
}
int main(){
    ll n;
    cin>>n;
    f[0]=1;
    f[1]=2;
    cout<<Dp(n)<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Zfio/p/12869723.html