题解

53 条题解

  • 1
    @ 2020-04-04 15:14:08
    #include <stdio.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        int divider = 1, ans = 0;
        while (n / divider > 0) {
            ans += n / divider / 2 + n / divider % 2;
            divider *= 4;
        }
        printf("%d\n", ans);
    }
    

    选出因数中只有2^0,2^2,2^4……的数,也即除以2^0,2^2,2^4……之后是奇数的数

  • 1
    @ 2017-08-25 01:35:18
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    long long aha(long long x)
    {
        if (x==0)
            return 0;
        else return
            (x+1)/2+aha(x/4);
    }
    int main()
    {
        long long n;
        scanf("%lld",&n);
        printf("%lld",aha(n));
        return 0;
    }
    
  • 0
    @ 2015-08-03 15:01:26

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    long long int n,f;
    long long int calcu(long long int n)
    {
    if(n<=1) return n;
    long long int ans=0;
    if(n%2==0) ans+=n/2;
    else ans+=n/2+1;
    ans+=calcu(n/4);
    return ans;
    }
    int main()
    {
    cin>>n;
    cout<<calcu(n)<<endl;
    return 0;
    }

  • 0
    @ 2014-10-31 21:23:48

    我的更好理解一些;
    每次只取n的后一半,因为它们的2倍不在a范围内,之后对于n的前一半,这一半的后一半由于乘2与之前重合,舍去,这一半的前一半与n的处理办法相同,递归下去即可。
    #include<iostream>
    #include<fstream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    long long int n,f;
    long long int calcu(long long int n)
    {
    if(n<=1) return n;
    long long int ans=0;
    if(n%2==0) ans+=n/2;
    else ans+=n/2+1;
    ans+=calcu(n/4);
    return ans;
    }
    int main()
    {
    cin>>n;
    cout<<calcu(n)<<endl;
    return 0;
    }

  • 0
    @ 2014-09-09 21:26:45

    裸秒了一道
    当前位置:/home/记录/详细
    个人通过/递交:58/179(32%)
    P1385盗窃-月之眼
    Accepted
    记录信息
    评测状态 Accepted
    题目 P1385 盗窃-月之眼
    递交时间 2014-09-09 21:25:56
    代码语言 C++
    评测机 上海红茶馆
    消耗时间 0 ms
    消耗内存 560 KiB
    评测时间 2014-09-09 21:25:58
    评测结果

    编译成功

    foo.cpp: In function 'int main()':
    foo.cpp:16:29: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat]

    测试数据 #0: Accepted, time = 0 ms, mem = 560 KiB, score = 20

    测试数据 #1: Accepted, time = 0 ms, mem = 560 KiB, score = 20

    测试数据 #2: Accepted, time = 0 ms, mem = 560 KiB, score = 20

    测试数据 #3: Accepted, time = 0 ms, mem = 560 KiB, score = 20

    测试数据 #4: Accepted, time = 0 ms, mem = 556 KiB, score = 20

    Accepted, time = 0 ms, mem = 560 KiB, score = 100
    代码

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>

    using namespace std;

    long long n;
    int flag;
    long long m;
    long long s;

    int main()
    {
    while( scanf( "%d" , &n ) != EOF )
    {
    s = 0;
    flag = 1;
    for( m = 1 ; m <= n ; m *= 2 , flag = -flag )
    s += ( n / m ) * flag;
    cout << s << endl;
    }
    return 0;
    }

  • 0
    @ 2014-08-17 12:44:39

    直接在代码框里写 没有任何难度

  • 0
    @ 2014-08-09 21:30:59

    真尼玛水比

  • 0
    @ 2014-08-09 21:30:33

    var n,sum:longint;
    begin
    read(n);
    while (1<=n) do
    begin
    sum:=sum+((n+1) div 2);n:=n div 2;n:=n div 2;
    end;
    write(sum);
    end.

  • 0
    @ 2014-04-07 16:04:59

    water water!!!
    program p1385;
    var
    n:longint;
    function f(a:longint):longint;
    begin
    if a=0 then exit(0);if a=1 then exit(1);
    exit((a+1)div 2+f(a div 4));
    end;
    begin
    read(n);
    writeln(f(n));
    end.

    • @ 2014-10-25 09:02:22

      很高兴看到连floyd都不会的我发的题解

    • @ 2014-10-25 09:08:24

      有一种感慨,noip2014来临,好好备战吧,可能oi生涯不长了
      愿我拿到奖

  • 0
    @ 2013-11-03 10:57:06

    农夫山泉有点甜,竟然交了两遍才过...
    var
    sum,n:int64;
    begin
    readln(n);
    while n<>0 do
    begin
    sum:=sum+n-(n div 2);
    n:=n div 4;
    end;
    writeln(sum);
    end.

  • 0
    @ 2013-10-28 19:47:29

    #include<iostream>
    using namespace std;
    int CC(int x){
    if (x==0) return 0;
    else return (x+1)/2+CC(x/4);
    }
    int main()
    {int n;
    cin>>n;
    cout<<CC(n);
    return 0;
    }

    前两次编译错误……不知道什么原因……

    • @ 2014-07-25 12:32:48

      include 没有打#

  • 0
    @ 2009-10-29 20:21:54

    数学题啊。。。证明不能,但AC很简单。

    先取n中的奇数,再取n中4的倍数中那些数可能的解,也就是出现子问题了.

    最后忏悔一下:我抄了代码...

  • 0
    @ 2009-09-27 13:54:08

    恭贺通过60题

    var

    n:longint;

    out:int64;

    begin

    readln(n);

    while n>1 do begin

    out:=out+n div 2;

    if odd(n)=true then inc(out);

    n:=(n div 2)div 2;

    end;

    if odd(n)=true then inc(out);

    writeln(out);

    end.

  • 0
    @ 2009-09-23 21:29:08

    program p1385;

    var i,j,k,n:int64;

    function f(x:int64):int64;

    begin

    if x=1 then exit(1);

    if x=0 then exit(0);

    exit((x+1)div 2+f(x div 4));

    end;

    begin

    readln(n);

    writeln(f(n));

    end.

    数学确实没白学,,这个是最早讲的集合题

  • 0
    @ 2009-09-01 14:43:55

    var n:longint;

    function xq(s:longint):longint;

    begin

    if s=0 then exit(0);

    xq:=(s+1)div 2+xq(s div 4);

    end;

    begin

    readln(n);

    writeln(xq(n));

    end.

    (jzjsupr)什么乱七八糟的,晕,看我的,包你100分!

  • 0
    @ 2009-08-31 08:15:13

    好东西啊~

  • 0
    @ 2009-08-20 18:57:08

    密码生成方法:设集合A中A={1,2,...,n},B为A子集。对于B中任意一个元素x,2x均不在集合B中。

    ?什么意思。。。

  • 0
    @ 2009-08-19 19:51:41

    庆祝我是第700个AC的

    大家看看curimit大牛的,很有用啊

  • 0
    @ 2009-08-10 01:45:51

    不知道大家做过这个题目没有:就是2x和3x都不能在集合里面的..这时候就要投影平面用状态压缩dp

    下面说下这道题:

    读入N,对于1~N中的所有数,考虑表示为2^i*pi的形式(i能多大则多大),则原问题答案就是对于每一个pi,集合{2^0*pi,2^2*pi...}的大小的和。

    可以看出,这个答案实际上就是pi的数量加上n/4对应的答案的数量,因此问题可以转化为子问题。

  • 0
    @ 2009-08-05 15:54:28

    51..100 :50个

    13..25 :13个

    4..6   :3个

    1     :1个

    此话怎讲?????

    Puzzling.........

    Puzzling.........

    Puzzling.........

    Puzzling.........

信息

ID
1385
难度
2
分类
数论 点击显示
标签
递交数
1002
已通过
579
通过率
58%
被复制
4
上传者