zoukankan      html  css  js  c++  java
  • 【找规律】ARC 066D Xor Sum AtCoder

    题目大意

    给出一个整数(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;
    }
    
  • 相关阅读:
    HMM (隐马尔可夫) 推导 (上)
    图模型初识
    K-means 和 EM 比较
    EM-高斯混合模型
    EM算法-完整推导
    EM算法直观认识
    pandas 之 时间序列索引
    K-Means 算法
    接口。
    第一册:lesson ninety-nine。
  • 原文地址:https://www.cnblogs.com/Midoria7/p/12859908.html
Copyright © 2011-2022 走看看