当前位置: 首页 > news >正文

[xdoj] 13011302 数字计数 数字计数的复仇

1.首先需要掌握二进制数的一种特性,00=0,01=1,10=2,11=3.每一个二进制的值代表他前面的二进数的个数,比如11=3,他的前面就有三个二进制的数字,不过在本题中,题目数据是1-n,故把0抛弃掉,答案就变成了3-1=2个,但还要加上自身的话,就还是二进制的值。比如10=2,前面有01和10.11=3,前面有01 10 11.以此类推。
2.那么问题就转化成了要求出小于等于给出十进制数字的最大二进制数,求出他的值即可。
比如123,最大就是111,结果就是7.
3. 问题转化成求最大的二进制数,如果十进制数的某一位大于1,那么他后面全可以取1能满足最大,对于右侧方法用po函数来计算这些全是1的位构成的二进制数字的最大值,对于左侧来说,把右侧的结果ans+1就变成了前一位2的n次方对应的值,相加即可得到最后的最大二进制数字。
4.关于数据范围:这是最令人讨厌的。
第一点假如想用pow来算那些位的种类数想都不要想,没有每次的取模,2的1000000次方是一个非常大的数字,对于10位当然是可以的最大才1024,但1000000分分钟超pow的范围。
第二点因为结果要对e9取模,可想而知每次运算的ans是e9这个数量级的范围,而那个每次的a*a更是一个超级大的数字,每次取模也是一个e9范围的数字,e9乘以一个e9就是e18,Long long的最大值是超过1e18的,只要单次不超范围,以后就可以取余。假如选择其他的这个乘法会导致溢出,所以肯定不行。1e9+7是一个经常出现的取模数字,它可以保证相加不爆int,相乘不爆longlong。这是应该记住的常识。
5.本题输入可是一个1000000位的数字,什么类型都没办法装下的,所以用字符串。而且是string,可以自动拓展,可以不用考虑开数组的大小的问题。
6.本题最难的点当然是计算了,用到了以前接触很少的左右移操作,及时进行取模。

#include <bits/stdc++.h>
const int Mod = 1e9 + 7;
using namespace std;
typedef long long ll;
ll po(ll a, ll b)
{
    ll ans=1;
    while (b)
    {
        if (b & 1)
        {
            ans = ans*a%Mod;
        }
        b >>= 1;
        a = a*a%Mod;
    }
    return ans;
}
int main()
{
    string str;
    ll ans;
    int i;
    while (cin >> str)
    {
        for (i = 0; i < str.length(); i++)
        {
            if (str[i] > '1')
            {
                break;
            }
        }
        ll l = str.length();
        ans = po(2, l - i) - 1;
        ll n;
        n = ans + 1;
        i--;
        for (; i >= 0; i--)
        {
            if (str[i] == '1')
                ans += n * 1;
            ans=ans%Mod;
            n = n * 2;
            n=n%Mod;
        }
        printf("%lld\n", ans);
    }
    
}

 

转载于:https://www.cnblogs.com/legendcong/p/9094936.html

相关文章:

  • php面试题12(多态web服务器共享session的方法:将session存到数据库)($val=$data[$key];)...
  • nohup和后台运行,进程查看及终止
  • bash命令行初探
  • 转: 关于linux用户时间与系统时间的说明
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • day01.1 vmware虚拟机
  • VMware Vsphere 虚拟化
  • CentOS7切换到root用户和退回普通用户
  • BZOJ5289 洛谷4437:[HNOI/AHOI2018]排列——题解
  • mysql grant授权
  • classloader实战:一个程序使用相同数据库的两个不同版本的jar包
  • 卷积核与特征提取
  • 常用的几个vagrant命令
  • SQL优化笔记
  • 【总结整理】关于二手交易平台的讨论
  • 5、React组件事件详解
  • CentOS 7 修改主机名
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS小技巧之UIImagePickerController实现头像选择
  • mongodb--安装和初步使用教程
  • Python3爬取英雄联盟英雄皮肤大图
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • webpack项目中使用grunt监听文件变动自动打包编译
  • XForms - 更强大的Form
  • 二维平面内的碰撞检测【一】
  • 力扣(LeetCode)21
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 人脸识别最新开发经验demo
  • 如何胜任知名企业的商业数据分析师?
  • 什么软件可以剪辑音乐?
  • 微信支付JSAPI,实测!终极方案
  • 一文看透浏览器架构
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #{}和${}的区别是什么 -- java面试
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (第二周)效能测试
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (剑指Offer)面试题34:丑数
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四)图像的%2线性拉伸
  • (译)2019年前端性能优化清单 — 下篇
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 知识杂记
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net8 Blazor 尝鲜
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C#] 我的log4net使用手册
  • [C#]winform部署yolov9的onnx模型
  • [CSS]CSS 的背景
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [HDU] 1054 Strategic Game 入门树形DP
  • [iOS]-UIKit