找规律ARC 066D Xor Sum AtCoder - 2272

Posted midoria7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找规律ARC 066D Xor Sum AtCoder - 2272相关的知识,希望对你有一定的参考价值。

题目大意

给出一个整数(n),已知(0le u,vle n),求满足(a xor b=u)(a+b=v)(a、b)对数

样例1输入

3

样例1输出

5
/*
u=0,v=0 (Let a=0,b=0, then 0 xor 0=0, 0+0=0.)
u=0,v=2 (Let a=1,b=1, then 1 xor 1=0, 1+1=2.)
u=1,v=1 (Let a=1,b=0, then 1 xor 0=1, 1+0=1.)
u=2,v=2 (Let a=2,b=0, then 2 xor 0=2, 2+0=2.)
u=3,v=3 (Let a=3,b=0, then 3 xor 0=3, 3+0=3.)
*/

样例2输入

1422

样例2输出

52277

样例3输入

1000000000000000000

样例3输出

787014179

思路

用暴力打表,前20个答案分别为1、2、4、5、8、10、13、14、18、21、26、28、33、36、40、41、46、50、57、60、68。
可以发现规律
(egin{cases} a_{2k}=2a_{k-1}+a_k a_{2k-1}=2a_k+a_{k-1} \end{cases})

代码

#include <cstdio>
#include <map>
typedef long long ll;
const int Mod=1e9+7;
const int maxn=1000000+5;
using namespace std;
ll a[30]={1,2,4,5,8,10,13,14,18,21,26,28,33,36,40,41,46,50,57,60,68};
map<ll,ll> mp;//记忆化

ll dfs(ll x) {
    if(x<=20)
        return a[x];
    if(mp[x])
        return mp[x];
    if(x%2)
        return mp[x]=(2*dfs(x/2)%Mod+dfs(x/2-1)%Mod)%Mod;
    else
        return mp[x]=(2*dfs(x/2-1)%Mod+dfs(x/2)%Mod)%Mod;
}

int main() {
    ll n;
    scanf("%lld",&n);
    printf("%lld
",dfs(n));
    return 0;
}









以上是关于找规律ARC 066D Xor Sum AtCoder - 2272的主要内容,如果未能解决你的问题,请参考以下文章

AT2272 [ARC066B] Xor Sum 题解

AT2272 [ARC066B] Xor Sum 题解

ARC 098 D - Xor Sum 2

[ARC066B] Xor Sum —— 递归

[ARC066B] Xor Sum —— 递归

AtCoder - arc098_b Xor Sum 2(尺取+位运算)