今天做的比赛,和队友都有轻微被虐的赶脚。

诶,我做的题就是这个题目了。

题目描述就是对于一个十进制数数位上的每一位当做一个二进制位来求出这个数,这个定义为G(x)。

题目给定你A和B,求在0-B范围内有多少个数x满足G(x)<=G(A)。

这个题目显然是个数位DP哦。可惜我在比赛的时候琢磨了好久才弄出来,诶,深坑队友啊。

这个题目给定的时间比较紧,只有500ms,但是数据也不强,只有10^9。

其实最最重要的优化(也是dp的一部分)就是预处理数组f[i][j](表示i位数构成的值的G函数值为j的种类数)

这样很显然很容易可以得到f[i]和f[i+1]的递推关系呢。

同时由于给定的范围只有10^9,所以对于i,我们只要处理到8就可以咯。你懂的。

同时我们可以先算一下,最大的那个数99999999(8个9)所对应的G函数的值(我算好像不过万吧)这样复杂度完全可以闭着眼睛承受。

于是在求的时候也是用的最最经典的数位DP的求法,这里就不详细说了,新手多刷几个水题就弄明白了。

其实这个题目最最关键的就是我刚刚说的这个预处理,但是这个预处理还是不够的,还要预处理f[i][j]的前缀和。

我们可以用sum[i][j]表示f[i][0]~f[i][j]的和,因为每次我们dp的时候要加的是那个和,所以有了这个预处理我们可以直接调用咯,还不怕数据大,每次都是一样的。

下面上我的代码吧,比赛的时候写的,代码有点乱,希望神犇不要喷我……

#include <iostream>
#include <cstring>
#define ll long long
#define maxn 10000
using namespace std; ll a[],b[],c[],A,B,t,na,nb,f[][maxn],ans,sum[][maxn],cas=; int main()
{
for (ll i=; i<; i++) c[i]=(<<i);
memset(f,,sizeof f);
memset(sum,,sizeof sum);
for (ll i=; i<; i++) f[][i]=;
for (ll i=; i<=; i++)
{
for (ll k=; k<maxn; k++)
{
if (f[i-][k]==) continue;
for (ll j=; j<; j++)
f[i][k+j*c[i-]]+=f[i-][k];
}
}
/*for (ll i=1; i<=5; i++)
{
for (ll j=0; j<=5; j++) cout<<f[i][j]<<' '; cout<<endl;
}*/
for (ll i=; i<=; i++)
{
sum[i][]=;
for (ll j=; j<maxn; j++) sum[i][j]=sum[i][j-]+f[i][j];
}
/*cout<<endl;
for (ll i=1; i<=5; i++)
{
for (ll j=0; j<=5; j++) cout<<sum[i][j]<<' '; cout<<endl;
}*/
cin>>t;
while (t--)
{
cin>>A>>B;
ans=na=nb=;
memset(a,,sizeof a);
memset(b,,sizeof b);
while (A) a[++na]=A%,A/=;
while (B) b[++nb]=B%,B/=;
for (ll i=; i<na; i++) a[i+]+=a[i]/,a[i]%=;
while (a[na]>) a[na+]=a[na]/,a[na]%=,na++;
/*for (ll i=na; i>0; i--) cout<<a[i]; cout<<endl;
for (ll i=nb; i>0; i--) cout<<b[i]; cout<<endl;*/
A=;
for (ll i=; i<=na; i++) A+=a[i]*c[i-];
for (ll i=nb; i>; i--)
{
for (ll j=; j<b[i]; j++)
if (A-j*c[i-]>=) ans+=sum[i-][A-j*c[i-]];
else break;
A-=b[i]*c[i-];
if (A<) break;
}
for (ll i=; i<=b[]; i++)
if (A>=i) ans++;
cout<<"Case #"<<++cas<<": "<<ans<<endl;
}
return;
}

HDU4734——2013 ACM/ICPC Asia Regional Chengdu Online的更多相关文章

  1. 2013 ACM/ICPC Asia Regional Chengdu Online 1004 Minimum palindrome

    Minimum palindrome Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. 2013 ACM/ICPC Asia Regional Chengdu Online---1003

    哈哈哈 #include <iostream> #include <cstring> #include <string> #include <cstdio&g ...

  3. 2013 ACM/ICPC Asia Regional Chengdu Online hdu4731 Minimum palindrome

    Minimum palindrome Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)

    Problem Description Pfctgeorge is totally a tall rich and handsome guy. He plans to build a huge wat ...

  5. HDU 4735 Little Wish~ lyrical step~(DLX搜索)(2013 ACM/ICPC Asia Regional Chengdu Online)

    Description N children are living in a tree with exactly N nodes, on each node there lies either a b ...

  6. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

  7. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

  8. hduoj 4715 Difference Between Primes 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Time Limit: 2000/1000 MS (J ...

  9. hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

随机推荐

  1. 自适应浏览器分辨率的javascript函数[转]

    function changeWidth(now,target) { //now是现在代码所适应的宽度,如800:target是想要达到的显示器分辨率宽度var widthStr; var flag ...

  2. css选择器分类与作用

    本文旨在总结css中各种选择器及其相应用途(持续更新) 通配符(全局)选择器 样式:*{} 示例: 总结:选定文档中所有类型的对象,如图所示写在css样式文件开头用来定义全局通用的一些属性.font- ...

  3. Jmeter+ant+jenkins接口自动化测试 平台搭建(二)

    一.依赖文件配置 1.在ant目录C:\apache-ant-1.10.5下新建一个demo文件夹,并将jmeter测试脚本放在该文件夹中 2.将\apache-jmeter-3.3\extras下面 ...

  4. 相机标定与矫正opencv+MATLAB

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  5. AssetBundle粒度与分配策略

    决定如何将项目内的资源分配到 AssetBundle 是不容易的.简单的规则都很有诱惑性,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle ...

  6. 百度地图在移动端下click无效的解决方案

    这是由于百度地图在移动端屏蔽了click事件,在网上找到一种方法,利用touchClick方法来模拟click事件,代码如下(需要JQ插件): //给jquery添加touchClick方法 (fun ...

  7. Stack Overflow访问问题的处理

    一直以来都有访问stackoverflow的习惯,但是老是因为js的问题让人很多操作都操作不了,而且打开的速度也很慢. 原因其实就是stackoverflow使用的google的cdn,于是想彻底一点 ...

  8. 基本数据结构 -- 栈简介(C语言实现)

    栈是一种后进先出的线性表,是最基本的一种数据结构,在许多地方都有应用. 一.什么是栈 栈是限制插入和删除只能在一个位置上进行的线性表.其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许 ...

  9. Playfair加密

    前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...

  10. 对React children 的深入理解

    React的核心为组件.你可以像嵌套HTML标签一样嵌套使用这些组件,这使得编写JSX更加容易因为它类似于标记语言. 当我刚开始学习React时,当时我认为“使用 props.children 就这么 ...