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 + ;
using namespace std;
typedef long long ll;
ll po(ll a, ll b)
{
ll ans=;
while (b)
{
if (b & )
{
ans = ans*a%Mod;
}
b >>= ;
a = a*a%Mod;
}
return ans;
}
int main()
{
string str;
ll ans;
int i;
while (cin >> str)
{
for (i = ; i < str.length(); i++)
{
if (str[i] > '')
{
break;
}
}
ll l = str.length();
ans = po(, l - i) - ;
ll n;
n = ans + ;
i--;
for (; i >= ; i--)
{
if (str[i] == '')
ans += n * ;
ans=ans%Mod;
n = n * ;
n=n%Mod;
}
printf("%lld\n", ans);
} }

[xdoj] 1301&1302 数字计数 数字计数的复仇的更多相关文章

  1. fastadmin Excel导出时数字被科学计数

    /public/assets/libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min.js //exportOpt ...

  2. cell1这个字符串如何截取掉前边的cell剩下后边的数字 后边数字长度不固定

    cell1这个字符串如何截取掉前边的cell剩下后边的数字  后边数字长度不固定'cell1'.replace(/cell/,'')string.substr(4)string.slice(4)

  3. C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空

    今天在做一个Excel导入功能,一切开发就绪,数据可以成功导入.导入后检查数据库发现有一列既有汉字又有数字,数字正常导入,汉字为空.但是前面同样既有汉字又有数字的列可以导入成功. 查看excel 源文 ...

  4. Java随机生成定长纯数字或数字字母混合数

    (转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码

  5. 设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak,证明:11|n的充分必要条件是11|T(n);(整除理论1.1.2))

    设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak, ...

  6. is_numeric — 检测变量是否为数字或数字字符串

    is_numeric — 检测变量是否为数字或数字字符串 bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE ,否则返回 FALSE . 参 ...

  7. PHP is_numeric 检测变量是否为数字或数字字符串

    bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE. For example 1: <?php $v = is_ ...

  8. HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)

    题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...

  9. excel怎么把文本格式的数字转换为数字,且把前面的撇号去掉

    excel把文本格式的数字转换为数字,且把前面的撇号去掉方法:1.选中要处理的列,在“数据”菜单下,选择“分列”.2.在“分列”向导对话框里,选择“分隔符号”,并点击下一步.3.在“分列”向导对话框第 ...

随机推荐

  1. MySQL5.6的4个自带库详解

    MySQL5.6的4个自带库详解 1.information_schema详细介绍: information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数 ...

  2. [No0000F1]js获取喜马拉雅和荔枝FM电台专辑音频

    荔枝FM小书签.txt javascript: (function() { if ($('#down_url')) { $('#down_url').remove(); }; $(document.b ...

  3. Java代理和动态代理机制分析和应用

    本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息 ...

  4. springmvc shiro整合cas单点登入

    shiro cas分为登入跟登出 maven依赖: <dependency> <groupId>org.apache.shiro</groupId> <art ...

  5. 获取文件后缀名(zip,rar等)

    var filename = file.name; var index1 = filename.lastIndexOf("."); var index2 = filename.le ...

  6. js生成唯一的id

    1.生成[0,1)的随机数的Math.random Math.random().toString().replace(".", "");// 生成唯一的id 2 ...

  7. 'react-scripts' is not recognized as an internal or external command

    React项目在执行npm start的时候报下面的错误: 解决办法:把项目目录中node_modules文件夹删掉,重新npm install一下,然后再执行npm start

  8. 【数据库】SQL语句解析

    学习网站: http://www.runoob.com/sql/sql-having.html 1. 1.现在我们想要查找总访问量大于 200 的网站. 回取出多条重复的网址的SQL语句: selec ...

  9. Vue通过build打包后 打开index.html页面是空白的

    最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直 ...

  10. navicat如何导出mysql数据表结构

    我们在创建数据库时会对字段进行设置,比如类型.长度等,如果字段多的话一个个设置非常麻烦,可以从其他地方已有的表导入数据表结构,怎么操作呢?我们拿navicat导出mysql数据表结构为例: 1.点击“ ...