zoukankan      html  css  js  c++  java
  • Xor Sum题解>----(思维+递归)

    Xor Sum AtCoder - 2272


    Time limit : 2sec / Memory limit : 256MB

    Score : 600 points

    Problem Statement

    You are given a positive integer N. Find the number of the pairs of integers u and v (0≦u,v≦N)such that there exist two non-negative integers a and b satisfying a xor b=u and a+b=v. Here, xor denotes the bitwise exclusive OR. Since it can be extremely large, compute the answer modulo 109+7.

    Constraints

    1≦N≦1018

    Input

    The input is given from Standard Input in the following format: N

    Output

    Print the number of the possible pairs of integers u and v, modulo 109+7.

    Sample Input 1

    3
    

    Sample Output 1

    5
    

    The five possible pairs of u and v are:

    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.)

    Sample Input 2

    1422
    

    Sample Output 2

    52277
    

    Sample Input 3

    1000000000000000000
    

    Sample Output 3

    787014179
    

    Solution

    题意:给出正整数N,求出整数对uv (0≤u,v≤N)的数目,使得存在两个非负整数ab满足a xor b = ua + b= v。这里,xor表示按位异或。对答案取模10^9 + 7

    这是一道dp题,由于a+b = (a & b) <<1 + a ^ b,故可知a ^ b定然小于a+b,故本题可以化为寻找对于a+b<=n中a b 的个数。(当然 0 和 1 与 1 和 0是1种情况)

    首先可以使用暴力的手段得知,当n=0的时候,答案为1,n=1的时候,答案为2。对于a与b(化作二进制来看),两者的末位和有0,1,2三种情况,设a+b=x,令a = a1 * 2+a2, b = b1 * 2 + b2,a2+b2即为两者的末位和,又有x<=n,故a1+a2<=(n-a1-a2)/2,可以得出递推式 f[x] = f[x/2] + f[(x-1)/2] + f[(x-2)/2];

    Code

    #include <cstdio>
    #include <map>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <string>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    const ll maxn=1e18+5;
    map <ll,ll> f;//n范围这么大,开数组开不下......
    ll Fc(ll x){
    	if(f[x])return f[x];
    	return f[x]=(Fc(x>>1)+Fc((x-1)>>1)+Fc((x-2)>>1))%mod;//这里用位移是比'/'快,当然也更好理解
    }
    int main(){
    	ll n;
    	scanf("%lld",&n);
    	f[0]=1;f[1]=2;
    	printf("%lld
    ",Fc(n));
    	return 0;
    }
    
  • 相关阅读:
    mtk camera 移植步骤
    Camera 涉及的文件70
    android camera(四):camera 驱动 GT2005
    android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
    android camera(三):camera V4L2 FIMC
    android camera(一):camera模组CMM介绍
    【译】第23节---Fluent API
    【译】第22节---Fluent API
    【译】第21节---Fluent API
    【译】第20节---数据注解-InverseProperty
  • 原文地址:https://www.cnblogs.com/Lour688/p/12870452.html
Copyright © 2011-2022 走看看