HDU 4588 Count The Carries(找规律,模拟)

题目

大意:

求二进制的a加到b的进位数。

思路:

列出前几个2进制,找规律模拟。

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

using namespace std;

int main()
{
    int a,b,id;
    __int64 ans,temp,len[63],aa,bb,cc,cc1,bb1;
    len[0]=1;
    for(int i=1;i<63;i++)
        len[i]=len[i-1]*2;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        id=0;
        b++;a++;
        ans=0;
        temp=1;
        while(temp)
        {
            temp=temp/2;
            ans+=temp;
            id++;
            aa= b/len[id]*len[id-1] - a/len[id]*len[id-1];
            bb=b%len[id], bb1 = a%len[id];
            cc=len[id-1], cc1 = len[id-1];
            if(bb<cc) bb=0,cc=0;
            if(bb1<cc1) bb1=0,cc1=0;
            temp=temp+aa+bb-cc-bb1+cc1;//原来是这里出了岔子,,,,唉
            if(  (a-1 ) & len[id-1] )
                temp++;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

HDU 4588 Count The Carries(找规律,模拟),布布扣,bubuko.com

时间: 2024-08-11 09:57:31

HDU 4588 Count The Carries(找规律,模拟)的相关文章

Hdu 4588 Count The Carries (规律)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4588 思路: 0     0000 1     0001 2     0010 3     0011 4     0100 5     0101 6     0110 7     0111 8    1000 9    1001 10  1010 观察可知,第i位有(1<<i)个0,与(1<<i)个1,按照长度为(1<<(i+1))长度循环.则对于数n,可以求出1到n中各位

HDU 4588 Count The Carries 数位DP || 打表找规律

2013年南京邀请赛的铜牌题...做的很是伤心,另外有两个不太好想到的地方....a 可以等于零,另外a到b的累加和比较大,大约在2^70左右. 首先说一下解题思路. 首先统计出每一位的1的个数,然后统一进位. 设最低位为1,次低位为2,依次类推,ans[]表示这一位上有多少个1,那么有 sum += ans[i]/2,ans[i+1] += ans[i]/2; sum即为答案. 好了,现在问题转化成怎么求ans[]了. 打表查规律比较神奇,上图不说话. 打表的代码 #include <algo

HDU 4588 Count The Carries (2013年南京邀请赛)

题目地址:HDU 4588 这题是学长跟我说的一道数位DP..然后我就按着数位DP去做的,倒是写出来了,但是一直TLE..后来用类似找规律的方法解出来了.. 首先这题其实就是求每位上总共有多少个1,然后不断从低位开始向高位进位. 方法是比如二进制为1010010的这个数,就可以拆成1000000+10000+10三个数,然后从0到111111就是0和1的一个全排序,那么每一位上的1的个数总和一定是占一半,然后首位+1,那么10000也可以这样算,然后累加起来就好了.但是还要注意的是,首位的1不只

HDU 4588 Count The Carries(数学 二进制 找规律啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4588 Problem Description One day, Implus gets interested in binary addition and binary carry. He will transfer all decimal digits to binary digits to make the addition. Not as clever as Gauss, to make th

HDU 4588 Count The Carries (数学,计数)

题意:给定两个十进制数,求二进制中,从x加到y的二进制进了多少位. 析:把这些数字的二进制纵向罗列出来,然后一位一位的把和加起来,最终得到总的进位数.从1到x,第i位上1的总数是x左移i+1位再右移i位后得到的, (在第 0位上,1和0以1010101010的周期出现,并且每个周期一个1,在第1位上,1和0以11001100的周期出现,并且每个周期2个1,以此类推,则第n位上的1的个数是x/2^n*2^(n-1),即先左移n+1位,再右移n位),如果x在i位上面上是1,特殊判断一下,求一下周期以

HDU 4572 Bottles Arrangement(找规律,仔细读题)

题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1,m-2,m-2,……,2,2,1,1求出前m个数字的和就是答案. //发现案例符合(之前的代码第二天发现案例都跑不对,真不知道我当时眼睛怎么了) #include <iostream> #include<stdio.h> #include<string.h> #inclu

HDU 2147-kiki&#39;s game(博弈/找规律)

kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 5485 Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his

洛谷 P1014 Cantor表【蛇皮矩阵/找规律/模拟】

题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号.第一项是1/1,然后是1/2,2/1,3/1,2/2,… 输入输出格式 输入格式: 整数N(1≤N≤10000000) 输出格式: 表中的第N项 输入输出样例 输入样例#1: 复制 7 输出样例#1: 复

8/2 multi4 E找规律+模拟,空间开小了然后一直WA。。。J爆搜check不严谨WA。。。multi3 G凸包判共线写错数组名???样例太好过.想哭jpg。

multi4 Problem E. Matrix from Arrays 题意:构造一个数组,求子矩阵前缀和. 思路:打表找规律,"发现"L为奇数时循环节为L,为偶数时循环节为2L,求相应循环节的二维前缀和然后加加减减计算一下就好. 虚伪地证明一下循环节:L为奇数时对于第x行/列开始的位置有(x  +  x+L-1)*L/2   ->     (2x+L-1)/2(为整数)*L,因此扫过L行/列也就扫过了L整数倍"(2x+L-1)/2"倍的A[0]~A[L],