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. vins-mono代码分析

    vins-mono的关键帧选择策略 1 与前一帧的平均视差.如果跟踪特征的平均视差超过某个阈值,我们会将此图像视为关键帧. 2 另一个是跟踪质量.如果跟踪特征的数量低于一个阈值,我们把这一帧看做一个新 ...

  2. Cnblog Markdown编辑器

    第一次使用Cnblog Markdown编辑器 1.在博客园使用 Markdown 与 LATEX[1] 1.1.开启MarkDown编辑器 选择 Markdown 撰写博文:在博客园管理-选项中,将 ...

  3. POJ 1456 - Supermarket - [贪心+小顶堆]

    题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...

  4. [No000016E]Spring 中获取 request 的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  5. [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)

    github地址:https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况,并调用接口,当资源被超额占用时,发送警报到个人手机: ...

  6. java 验证字符串是否包含中文字符

    中文的模式:"[\\u4e00-\\u9fa5]|\\\\u" 例子: private static final Pattern p = Pattern.compile(" ...

  7. 为什么css定位雪碧图(合成图)都要以负号开头?

    (1)正常来说 定位坐标是以 合成图片 左上角这个点作为原点(0px,0px)开始读取的, 而你的图片全都在坐标系的 第四象限 background-position: x y:(x,y为数值或百分比 ...

  8. php值callback类型和匿名函数(闭包)

    callback.callable类型 自PHP5.4起可以使用callable类型制定回调类型callback. 本文档基于同样理由使用callback类型信息. 一些函数如call_user_fu ...

  9. java登录怎么做

    (一)1.先查找有没当前用户.2.对比用户名和密码3.返回用户信息 @Override public AppResultEntity userLogin(String username, String ...

  10. zookeeper 杂记

    Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M.