LightOJ 1352 Strange Summation(找规律or数位DP)
2016-04-24 23:20
337 查看
解析:
将[l,r]的所有二进制数字左对齐后做不进位的加法运算后的值(注意是不进位!
写一下找找规律就好。
将[l,r]的所有二进制数字左对齐后做不进位的加法运算后的值(注意是不进位!
写一下找找规律就好。
: [code]#include<cstdio> #include<cstring> using namespace std; typedef unsigned long long LL; LL num[70]; int top; void sol(LL n,int p){ //printf("-> %llu %d\n",n,p); LL m,j,cnt; int i; num[0] += p*n; for(i = 1;i < 63;i++){ m = 1LL<<i;j = 1; if(m > n) break; while(2*m <= n){ num[i] += p*m/2; m *= 2; j *= 2; } m = n-m+1; //printf("m:%llu j:%llu\n",m,j); num[i] += p*j*(m/j/2); if((m/j)&1) num[i] += p*(m%j); //printf("i:%d numi:%llu\n",i,num[i]); } } int main(){ int i,j,cas; LL l,r; scanf("%d",&cas); for(int T=1;T<=cas;T++){ scanf("%llu%llu",&l,&r); memset(num,0,sizeof(num)); sol(r,1); sol(l-1,-1); for(top = 0;r;r>>=1,top++); LL ans = 0; for(i = top-1;i >= 0;i--){ //printf("%d %llu\n",i,num[i]); ans += (num[i]&1LL)<<(top-1-i); /*for(j = 1;j <= i;j++){ num[i-j] += (num[i]>>j&1); }*/ } printf("Case %d: %llu\n",T,ans); } return 0; }
相关文章推荐
- linux磁盘管理及文件系统介绍
- Linux下nginx php-fpm安装配置笔记
- Eclipse的Debug调试技巧
- Eclipse的Debug调试技巧
- UIRefreshControl下拉刷新的用法
- Eclipse的Debug调试技巧
- 第三次实验报告
- LeetCode 292
- nginx+tomcat 负载均衡
- 《一个定理的诞生》感
- 20145221 《Java程序设计》实验报告三:敏捷开发与XP实践
- 20145214实验三 敏捷开发与XP实践
- 搜狗输入法使用评价
- Java中的static关键字
- Linux内核学习总结
- 第10章 外部性
- Python3.4的面向对象
- LeetCode 283
- LeetCode *** 143. Reorder List
- WebService可用公用接口