博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HDOJ4588]Count The Carries(数学,规律)
阅读量:5279 次
发布时间:2019-06-14

本文共 1240 字,大约阅读时间需要 4 分钟。

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

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

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

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

1 #include 
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 }

 

转载于:https://www.cnblogs.com/kirai/p/6792441.html

你可能感兴趣的文章
javascript中for...in和for...of的区别
查看>>
a--
查看>>
[Java Sprint] Spring Configuration Using Java
查看>>
[Angular 2]ng-class and Encapsulated Component Style2
查看>>
(二)springmvc项目整合easyopen
查看>>
C#获取可执行文件的路径
查看>>
nginx中配置proxy_pass
查看>>
【Spring】3、BeanFactory 和 ApplicationContext的区别
查看>>
[51nod1685]第k大区间
查看>>
MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
查看>>
Delphi 基础(1)常用函数
查看>>
如何学会拒绝及怎么拒绝
查看>>
上一周下一周
查看>>
【中间件】Struts2系列漏洞POC小结
查看>>
Step-by-Step: Installing SQL Server Management Studio2008 Express after Visual Studio 2010(zz)
查看>>
站在巨人的肩膀上 -- 书籍推荐 (zz)
查看>>
WPF TreeView递归遍历相关方法
查看>>
题解 CF9C 【Hexadecimal's Numbers】
查看>>
iOS 网易彩票-2框架搭建-代码重构
查看>>
python的模块
查看>>