码迷,mamicode.com
首页 > 其他好文 > 详细

【找规律】ARC 066D Xor Sum AtCoder - 2272

时间:2020-05-09 20:49:36      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:输入   暴力   ace   typedef   思路   def   代码   cas   let   

题目大意

给出一个整数\(n\),已知\(0\le u,v\le 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。
可以发现规律
\(\begin{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\n",dfs(n));
    return 0;
}

【找规律】ARC 066D Xor Sum AtCoder - 2272

标签:输入   暴力   ace   typedef   思路   def   代码   cas   let   

原文地址:https://www.cnblogs.com/Midoria7/p/12859908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!