先考虑如何判定一个$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]装饼干的更多相关文章

  1. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...

  2. LinuxMint装JDK和Eclipse

    Linux Mint 装JDK和Eclipse 前言 在尝试了好几个发行版后终于锁定了Linux Mint Cinnamon .那么就得配置好环境了. 这里讲一下JAVA环境,配置JDK和Eclips ...

  3. VS2015安装之后加装SQL SERVER2014的步骤

    网上一直说的是先安装SQL Server 2014,再安装VS2015,软件就不会出现问题.我这次在什么都没准备的情况下安装了VS2015,安装之后发觉VS2015自带的SQL2014只有连接服务器和 ...

  4. ubuntu 14.04 desktop装vnc4server

    ubuntu 14.04 desktop上安装vnc4server要装上gnome的一些软件包并修改启动文件~/.vnc/xstartup 问题来源How to make VNC Server wor ...

  5. [LeetCode] Container With Most Water 装最多水的容器

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...

  6. 如何装最多的水? — leetcode 11. Container With Most Water

    炎炎夏日,还是呆在空调房里切切题吧. Container With Most Water,题意其实有点噱头,简化下就是,给一个数组,恩,就叫 height 吧,从中任选两项 i 和 j(i <= ...

  7. 装X代码

    装X代码 http://hackcode.ishoulu.com/scp/ http://hackcode.ishoulu.com/umbrella/ http://hackcode.ishoulu. ...

  8. Dell R730 配置完RAID后装系统找不到硬盘。

    1. 各硬盘只是灯都正常.硬件无故障. 2. 8个600G硬盘做的RAID0和RAID5后都在装系统选盘处找不到硬盘.(注意: 第一次做raid 时,没有进行初始化init.后补做也无效,一直复现这个 ...

  9. acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)

    日常手贱把ubuntu14.04更新到了16.04,然后就game over了.mdzz,不然泥萌也看不到这篇博客了=.= 然后花了些时间重装了一个16.04版的,原来那个14.04的用可以用,就是动 ...

随机推荐

  1. CQOI2021 退役记

    Day -1 晚上去了酒店然后就睡觉了. Day 1 进考场之前互相奶. 进了考场之后看题,发现T1很水(伏笔1,然后直接开始写 \(\Theta(n\log^2n)\)(二分+动态开点线段树),调了 ...

  2. 题解 P6454 麻将 加强版

    题目传送门 题目大意 不想写了,直接看题面吧. 思路 被这个题搞自闭了,因为读错题目想一个非常恶心的东西想了一场考试,然后就删代码,然后就被骂了.哎. 需要注意的是:我们只能选一次雀头 于是,不难看出 ...

  3. Vuls 漏洞扫描工具部署及效果展示

    Vuls 漏洞扫描工具部署及效果展示 介绍 Vuls根据NVD,OVAL等数据对主流Linux系统进行扫描,并具有完善的报告. 支持系统 Distribution Release Alpine 3.3 ...

  4. 2021年1月-第02阶段-前端基础-HTML+CSS进阶-VS Code 软件

    软件安装 VSCode软件 能够安装 VS Code 能够熟练使用 VS Code 软件 能够安装 VS Code 最常用的插件 1. VS Code简介 1.1 VS Code 简介 Visual ...

  5. Sentinel-Go 源码系列(一)|开篇

    大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件. 本次选择了 Sentinel-Go,一是对 Java 版本的 Sent ...

  6. IDA硬编码修改SO,重新打包APK绕过FRIDA反调试

    该案例来自看雪 通过IDA修改SO 找到检测点 修改字符串 双击该字符串进入TEXT VIEW 选择 HEX VIEW 修改十六进制 右击EDIT 修改字符 右击 菜单栏-> edit -> ...

  7. TCP 粘包 - 拆包问题及解决方案

    目录 TCP粘包拆包问题 什么是粘包 - 拆包问题 为什么存在粘包 - 拆包问题 粘包 - 拆包 演示 粘包 - 拆包 解决方案 方式一: 固定缓冲区大小 方式二: 封装请求协议 方式三: 特殊字符结 ...

  8. Golang通脉之指针

    指针的概念 指针是存储另一个变量的内存地址的变量. 变量是一种使用方便的占位符,用于引用计算机内存地址. 一个指针变量可以指向任何一个值的内存地址. 在上面的图中,变量b的值为156,存储在内存地址0 ...

  9. STM32中操作寄存器GPIOB_CRL &= ~( 0x0F<< (4*0))与GPIOB_CRL &=~(0x0F)之间有什么区别吗?

    没有区别,作用相同.只是这样写便于修改和沿用. 对于只用到PB0端口的程序~(0x0f << (4*0)) 和~0x0f没有区别.0x0f <<(4*N) 就是 向左 移动N个 ...

  10. 初学python-day3 列表