[xdoj] 1301&1302 数字计数 数字计数的复仇
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 数字计数 数字计数的复仇的更多相关文章
- fastadmin Excel导出时数字被科学计数
/public/assets/libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min.js //exportOpt ...
- cell1这个字符串如何截取掉前边的cell剩下后边的数字 后边数字长度不固定
cell1这个字符串如何截取掉前边的cell剩下后边的数字 后边数字长度不固定'cell1'.replace(/cell/,'')string.substr(4)string.slice(4)
- C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空
今天在做一个Excel导入功能,一切开发就绪,数据可以成功导入.导入后检查数据库发现有一列既有汉字又有数字,数字正常导入,汉字为空.但是前面同样既有汉字又有数字的列可以导入成功. 查看excel 源文 ...
- Java随机生成定长纯数字或数字字母混合数
(转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码
- 设正整数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, ...
- is_numeric — 检测变量是否为数字或数字字符串
is_numeric — 检测变量是否为数字或数字字符串 bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE ,否则返回 FALSE . 参 ...
- PHP is_numeric 检测变量是否为数字或数字字符串
bool is_numeric ( mixed $var ) 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE. For example 1: <?php $v = is_ ...
- HDU 4352 区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K(数位DP+LIS)
题目:区间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K 思路:用dp[i][state][j]表示到第i位状态为state,最长上升序列的长度为k的方案数.那么只要模拟nlogn写法的 ...
- excel怎么把文本格式的数字转换为数字,且把前面的撇号去掉
excel把文本格式的数字转换为数字,且把前面的撇号去掉方法:1.选中要处理的列,在“数据”菜单下,选择“分列”.2.在“分列”向导对话框里,选择“分隔符号”,并点击下一步.3.在“分列”向导对话框第 ...
随机推荐
- Missing artifact com.h2database:h2:jar:1.4.197
之前OK的项目再次打开pom上报错: 一起出现的现象: maven库中这个包和H2数据库的包每次项目右键→maven→update project都会产生.lastupdate文件.原来是以前从mav ...
- [No0000143]Win10“卓越性能模式”
从不久之前Win10更新1803以来,微软不仅带来了一些新功能(和BUG),还悄悄地加入了一个“卓越性能模式”,老张想了想,不对呀,以前就有了一个“高性能模式”,这怎么就还多出个新的性能模式来,难道会 ...
- NULL - AUTO_INCREMENT
http://dev.mysql.com/doc/refman/5.7/en/create-table.html Data Types and Attributes for Columns data_ ...
- Xcode编辑器之基本使用(一)
前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...
- Instruments之Activity Monitor使用入门
Activity Monitor,官方解释为:(活动监视器)即实时显示CPU.内存和网络的使用情况,记录由虚拟内存大小测量的系统负载.用一句大白话来说,Activity Monitor类似Window ...
- [skill][vim] 常用技巧与配置
一: 光标行列高亮 可以使用 :help highlight 查看相信帮助可颜色配置. set cursorline set cursorcolumn highlight Cursorline ct ...
- 《Redis 数据操作》
一:字符串类型(string) - 应用场景 - 用于常规计数,常规的 key-value 存储. - 常用操作 常用操作 设置一个值为(字符串类型) SET key value 设置一个值并设置过 ...
- jMeter_响应数据乱码
jMeter测试时服务响应数据乱码 方式一:修改配置文件参数 1.修改jMeter安装目录 jmeter.properties 中 sampleresult.default.encoding=UTF- ...
- idea导出可执行jar包
一. 在菜单中选择 File->project structure. 二. 在弹出的窗口中左侧选中"Artifacts",点击"+"选择jar,然后选择& ...
- jquery键盘事件
场景:当我们遇到onclick按钮事件时需要按回车执行时就用到了键盘监听事件 例如:<button id="sign_in_button" class="btn b ...