题意:给定a和b,n,让你求b+a, b+2*a, .......b+n*a里面有多少1.

当统计第K位的时候 可以注意到 第 B+T*A 和 B+(T+2^(K+1))*A 位是相同的

那么 第K位的时候 只需要统计2^(K + 1)  - 1次就可以了

当统计第K位的时候 可以注意到 连续的 (2^K)/A都是连续的0 或者连续的1 所以可以考虑直接连续记录(2^K)/A个结果。

那么 第K位的时候 只需要统计N / ((2^K)/A)次就可以了
那么 第K位的时候 只需要统计 2^K/((2^K)/A) 复杂度 变为O(A)

以上是题解。当然,第一部分很容易想到,但是那个优化我没想到。。。。其实是个很简单的优化了吧。如,当统计第K位时,第K位后面的数字决定了有多少个连续的第K位的相同的数字。最大是到后面的数字全为1。所以,只需统计到最大为全1的情况即可,当然是可以小于的。这就很容易理解了。也算是一种常用的技巧了,但做的时候竟然没想到。。。

#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
typedef long long LL;void Solve(LL a,LL b,LL n)
{LL cnt=0;LL max=b+a*n;for(LL i=0;i<64;i++){LL m=(LL)1<<i;LL mm=m;if(m>max) break;m<<=1;LL cur=a+b;LL j=0;while(j<m&&j<n){LL step=((mm-1)-cur&(mm-1))/a+(LL)1;if(j+step>=n) step=n-j;if(j+step>=m) step=m-j;if(cur&(LL)1<<i){cnt+=step*(n/m);if(j+step<(n%m)) cnt+=step;else if(j<(n%m)) cnt+=(n%m)-j;}cur+=a*step;j+=step;}}cout<<cnt<<endl;
}int main()
{int t,k=1;LL a,b,n,i,j;cin>>t;while(t--){cin>>a>>b>>n;cout<<"Case #"<<k++<<": ";Solve(a,b,n);}return 0;
}

  

转载于:https://www.cnblogs.com/jie-dcai/p/4085313.html

HDU 4321 Contest 3相关推荐

  1. hdu 5045 Contest(状态压缩DP)

    题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...

  2. HDU 5045 Contest

    主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me . 解题思路: 遗憾 ! 感觉领悟 ...

  3. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  4. HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2

    /* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...

  5. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...

  6. hdu 4925 Apple Tree--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...

  7. Coding Contest HDU - 5988

    Coding Contest HDU - 5988 题意: 有n个点,m个边,每个点有人数和食物数,每个人都要吃一份食物,如果该点的食物不够,他们就要去其他点,每个边最多只能走c次,每次有人走一条路, ...

  8. HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)

    HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...

  9. HDU 6638 [2019 Multi-University Training Contest 6]

    Snowy Smile Problem Description There are n pirate chests buried in Byteland, labeled by 1,2,-,n. Th ...

最新文章

  1. spring boot 1.5.4 之监控Actuator(十四)
  2. 523. Continuous Subarray Sum
  3. Python基础02-序列及通用操作
  4. 5-2 决策树算法预测销量高低代码
  5. python2.7输入函数_Python2.7的用户输入函数有问题,无法让这些输入与程序一起工作...
  6. 如何在电脑上截屏_如何在电脑上截图?教你6种常用的截图方法,总有你不知道的...
  7. python web应用_如何使用Python将通知发送到Web应用
  8. qrcode-php生成二维码
  9. UVA11027 Palindromic Permutation【回文】
  10. SpringApplication.run方法分析
  11. 柬埔寨攻略―签证、机票
  12. 小程序发布上线-微信小程序开发-视频教程17
  13. android 照相机开发
  14. 进存销管理系统(仓库管理系统)
  15. 小程序与后台 api接口数据交互详解(微信报修小程序源码讲解七)
  16. 请上传sku预览图后重新操作_增值税专用发票申请开票限额操作指南
  17. 三维智慧城市数字孪生应用可视化设计
  18. split()函数的使用方法
  19. 伯努利数简单学习笔记
  20. 使用uview中的u-upload上传图片

热门文章

  1. html如何超链接到servlet
  2. 搭建Qt 5.3.1 for Windows Phone 8开发环境
  3. TCP 连接的前世今生
  4. golang中的strings.Contains
  5. golang常见字符串操作函数
  6. 面试腾讯算法:组合总和
  7. 用宏定义代替printf函数
  8. 采样方法---吉布斯采样
  9. redis的bitset实战
  10. 信息系统定级与备案工作介绍