zoukankan      html  css  js  c++  java
  • ACDream

    先上题目:

    C - Lowbit Sum

    Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
    SubmitStatus

    Problem Description

    long long ans = 0;
    for(int i = 1; i <= n; i ++)
        ans += lowbit(i)
    lowbit(i)的意思是将i转化成二进制数之后,只保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数
    比如lowbit(7),7的二进制位是111,lowbit(7) = 1
    6 = 110(2),lowbit(6) = 2,同理lowbit(4) = 4,lowbit(12) = 4,lowbit(2) = 2,lowbit(8) = 8

    每输入一个n,求ans

    Input

    多组数据,每组数据一个n(1 <= n <= 10^9)

    Output

    每组数据输出一行,对应的ans

    Sample Input

    1
    2
    3

    Sample Output

    1
    3
    4

      规律题,如果熟悉树状数组的话说不定可以直接得到答案,如果不熟悉的话可以打表看一下,可以发现前几项lowbit大概是1,2,1,4,1,2,1,8,······发现奇数项都是1,这是lowbit运算导致的,然后偶数项提出来,如果都除以2,发现就会变成1,2,1,4,···然后就有感觉是迭代了,最终得到公式
      ans(x)=2*ans(x/2)+n/2+(n&1)

    上代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 #define lowbit(x) (x & (-x))
     6 #define MAX 100002
     7 #define LL long long
     8 using namespace std;
     9  
    10  
    11 LL solve(int n){
    12     if(n==1) return 1;
    13     LL ans =  2*solve(n>>1) + n/2;
    14     if(n&1) ans++;
    15     return ans;
    16 }
    17  
    18 int main()
    19 {
    20     int n;
    21     while(scanf("%d",&n)!=EOF){
    22         printf("%lld
    ",solve(n));
    23     }
    24     return 0;
    25 }
    Lowbit Sum
  • 相关阅读:
    关于Hibernate(JPA)关联关系加载的默认值
    (转)存储过程语法及实例
    网页qq
    git的代理配置
    The problem with POSIX semaphores 使用信号做进程互斥必看
    git merge conflict的处理
    转载:telnet协议详细描述
    Mac OS X terminal滚动慢的问题
    进程间通讯 信号量函数 semget() semop() semctl()
    .hpp文件和.h文件的区别
  • 原文地址:https://www.cnblogs.com/sineatos/p/3867506.html
Copyright © 2011-2022 走看看