[loj3367]装饼干
先考虑如何判定一个$y$是否可行——从高位开始,记录这一位所需要的$2^{i}$数量$t$,若$y$的这一位为1,则$t+=x$,之后分两类讨论:1.$t\le a_{i}$,令$t=0$;2.$b>a_{i}$,令$t=2(t-a_{i})$,记比较之前的$t$为$b_{i}$,最终,我们需要让$b_{0}\le a_{0}$
考虑dp,设$f[i]$表示仅考虑$y$的第$[i,k)$位,且满足$b_{i}\le a_{i}$的$y$的数量,那么答案即为$f[0]$
枚举$j$表示上一个满足$b_{j}\le a_{j}$的位置,那么要满足$\forall j<k< i,b_{j}>a_{j}$且$b_{i}\le a_{i}$
假设$y$的第$j-1$到$i$位依次为$p_{i},...,p_{j-1}$,则有$b_{k}=\sum_{l=k}^{j-1}xp_{l}\cdot 2^{l-k}-\sum_{l=k+1}^{j-1}a_{l}\cdot 2^{l-k}$,由于后者为常数,不妨记为$C_{k}$,则要求$\forall j<k<i,\sum_{l=k}^{j-1}xp_{l}\cdot 2^{l-k}> \frac{C_{k}+a_{k}}{x}$且$\sum_{l=i}^{j-1}xp_{l}\cdot 2^{l-i}\le \frac{C_{i}+a_{i}}{x}$
对于第一个条件,$\sum_{l=i}^{j-1}p_{l}\cdot 2^{l-i}$越大越容易实现,因此可以给出这个值的下限,第二个条件又给出了上限,上限-下限+1即为答案
有两个细节问题:1.$y$的位数不一定为$k$,因此要补0到60位;2.上限要对$2^{j-i}-1$取$min$,若下限>上限则不可能出现这种情况,即对0取max
这样暴力计算时间复杂度为$o(qk^{3})$,发现$C_{k}$与$i$无关,因此可以优化到$o(qk^{2})$

1 #include "biscuits.h"
2 #include<bits/stdc++.h>
3 using namespace std;
4 #define ll long long
5 int n;
6 ll f[105];
7 ll count_tastiness(ll x,vector<ll>a){
8 while (a.size()<60)a.push_back(0);
9 n=60;
10 memset(f,0,sizeof(f));
11 f[n]=1;
12 for(int i=n-1;i>=0;i--)
13 for(int j=i+1;j<=n;j++){
14 ll mn=0,mx=0;
15 for(int k=j-1;k>=i;k--){
16 mx=mx*2+a[k];
17 if (k>i)mn=max(mn,((mx/x+1)<<(k-i)));
18 }
19 f[i]+=f[j]*max(min(mx/x,(1LL<<j-i)-1)-mn+1,0LL);
20 }
21 return f[0];
22 }
[loj3367]装饼干的更多相关文章
- 程序员装B指南
一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...
- LinuxMint装JDK和Eclipse
Linux Mint 装JDK和Eclipse 前言 在尝试了好几个发行版后终于锁定了Linux Mint Cinnamon .那么就得配置好环境了. 这里讲一下JAVA环境,配置JDK和Eclips ...
- VS2015安装之后加装SQL SERVER2014的步骤
网上一直说的是先安装SQL Server 2014,再安装VS2015,软件就不会出现问题.我这次在什么都没准备的情况下安装了VS2015,安装之后发觉VS2015自带的SQL2014只有连接服务器和 ...
- ubuntu 14.04 desktop装vnc4server
ubuntu 14.04 desktop上安装vnc4server要装上gnome的一些软件包并修改启动文件~/.vnc/xstartup 问题来源How to make VNC Server wor ...
- [LeetCode] Container With Most Water 装最多水的容器
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- 如何装最多的水? — leetcode 11. Container With Most Water
炎炎夏日,还是呆在空调房里切切题吧. Container With Most Water,题意其实有点噱头,简化下就是,给一个数组,恩,就叫 height 吧,从中任选两项 i 和 j(i <= ...
- 装X代码
装X代码 http://hackcode.ishoulu.com/scp/ http://hackcode.ishoulu.com/umbrella/ http://hackcode.ishoulu. ...
- Dell R730 配置完RAID后装系统找不到硬盘。
1. 各硬盘只是灯都正常.硬件无故障. 2. 8个600G硬盘做的RAID0和RAID5后都在装系统选盘处找不到硬盘.(注意: 第一次做raid 时,没有进行初始化init.后补做也无效,一直复现这个 ...
- acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
日常手贱把ubuntu14.04更新到了16.04,然后就game over了.mdzz,不然泥萌也看不到这篇博客了=.= 然后花了些时间重装了一个16.04版的,原来那个14.04的用可以用,就是动 ...
随机推荐
- C++核心编程 2 引用
引用的基本使用 作用:给变量起别名 ,语法:数据类型 & 别名 = 原名 注意:引用必须初始化,且初始化之后,就不可更改. 引用做函数参数 作用:函数传参时,可以利用引用的技术让形参修饰实参 ...
- 阿里云研究员叔同:Serverless 正当时!
作者 | 叔同 导读:Serverless 将开发人员从繁重的手动资源管理和性能优化中解放出来,就像数十年前汇编语言演变到高级语言的过程一样,云计算生产力再一次发生变革.Serverless 的核心价 ...
- Arcscene教程
筛选 看不清的话可以进行如下操作:右键-->属性-->符号系统-->把高程前面的对号取消-->添加- ...
- appium启动ios系统上面的app需求的参数
Appium启动APP至少需要7个参数 'platformVersion','deviceName'.'udid'.'bundleId'.'platformName'.'automationName ...
- Docker--harbor私有仓库部署与管理
目录 一.Harbor简介 二.Harbor 部署 三.维护管理Harbor 一.Harbor简介 1.什么是Harbor ? Harbor 是 VMware 公司开源的企业级 Docker Re ...
- 掌握BeanShell,轻松处理jmeter中的数据
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15424558.html 博客主页:https://www.cnblogs.com/testero ...
- javascript-jquery对象的属性处理
1.attr()方法:获取元素某个属性的值. $("img").attr("title");//获得第一个<img>元素的title属性 $(&qu ...
- 《JavaScript DOM编程艺术》:+= 相加之后再赋值
第2章 第20页 += var year = 2010; var message = "The year is"; message += year; message += yea ...
- 单片机STM32学习笔记之寄存器映射详解
我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫寄存器映射?寄存器到底是什么? 在存储器Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一 ...
- 0x04
二分: while(l<r) { int mid=(l+r)/2; if(符合条件) r=mid; else l=mid+1; } 固定下二分的写法: 终止条件:l==r: 取mid=(l+r) ...