[HDOJ4588]Count The Carries(数学,规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4588

题意:从a加到b,每次结果加到a上,看在二进制下一共发生了多少次进位。

把0到n的所有数二进制下下来,可以发现规律:第一位循环节为2,每次循环01。第二位循环节是4,每次循环0011。以此类推。

计算两个数的各位分别出现了多少次1,再减掉。模拟进位统计进位次数就可以。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 10100;
 6 LL a, b;
 7 LL vis1[maxn], vis2[maxn];
 8 LL vis[maxn];
 9
10 void f(LL* vis, LL x) {
11     memset(vis, 0, sizeof(vis));
12     for(LL i = 1; i <= 62; i++) {
13         LL t = (1LL << i);
14         LL div = x / t;
15         LL rem = x % t;
16         LL cnt = div * (1LL << (i - 1LL));
17         cnt += (rem + 1LL) > (t / 2LL) ? rem + 1 - t / 2LL : 0LL;
18         vis[i] = cnt;
19     }
20 }
21
22 int main() {
23     // freopen("in", "r", stdin);
24     // freopen("out.txt", "w", stdout);
25     while(~scanf("%lld%lld",&a,&b)) {
26         f(vis1, a-1); f(vis2, b);
27         memset(vis, 0, sizeof(vis));
28         for(LL i = 1; i <= 62; i++) {
29             vis[i] = vis2[i] - vis1[i];
30         }
31         LL ret = 0;
32         for(LL i = 1; i <= 63; i++) {
33             ret += vis[i] / 2LL;
34             vis[i+1] += vis[i] / 2LL;
35         }
36         printf("%lld\n", ret);
37     }
38     return 0;
39 }
时间: 2024-10-22 17:33:44

[HDOJ4588]Count The Carries(数学,规律)的相关文章

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 (规律)

题目地址: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(找规律,模拟)

题目 大意: 求二进制的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

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

hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

#1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a circle bouncing in a rectangle. As shown in the figure below, the rectangle is divided into N×M grids, and the circle fits exactly one grid. The bouncing

[C++]LeetCode: 114 Permutation Sequence(返回第k个阶乘序列——寻找数学规律)

题目: The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312" &q

HDU 1005 Number Sequence (数学规律)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104190    Accepted Submission(s): 25232 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

2013 南京邀请赛 C count the carries

1 /** 2 大意: 给定区间(a,b), 将其转化为二进制 计算从a+(a+1)+(a+2)....+(a+b-1),一共有多少次进位 3 思路: 将(a,b)区间内的数,转化为二进制后,看其每一位一共有多少个1 4 可知最低位循环为2,第二位循环为4 5 ---〉 所以每一位的1的个数为 : 假设为第三位 (n-n%8)/8*8/2===>(n-n%8)/2 6 ------> 如果n%8 大于8/2 那么应该再加上 n%8-8/2 7 **/ 8 #include <iostre

Uva 1315 - Creaz tea party ( 数学 + 规律 )

Uva 1315 - Creaz tea party (  数学 + 规律 ) 题意: 一个环,围在一个坐了N个人.每次操纵可以交换相邻的两个人的位置.求最少需要交换几次,可以变为逆序. 这里的逆序指的是原来在A左边的人在A的右边,在A右边的在A的左边. 分析: 如果是线性的,,,果断类似冒牌排序(n)(n-1)/2 但是这里是环,推了推但是推不出结果..结论是将环分为两段线性的序列,线性的满足上面的公式. 如:     1 2 3 4 5  线性:  5 4 3 2 1  ( 10次 ) 环状