\(\\\)

\(Description\)


\(B\)进制数,每个数字\(i(i\in [0,B-1])\)有\(A_i\)个。用这些数字组成一个最大的\(B\)进制数\(X\)(不能有前导零,不需要

用完所有数字),使得\(X\)是\(B-1\)的倍数。\(q\)次询问,每次询问\(X\)在\(B\)进制下的第\(k\)位数字是什么。

  • \(B\in [2,10^6]\),\(A_i\in [1,10^6]\),\(q\in [1,10^5]\),\(k\in [1,10^{18}]\)

\(\\\)

\(Solution\)


  • 首先考虑位本身的影响,因为\(B\equiv1\pmod{B-1}\),则有\(B^K\equiv1\pmod{B-1}\),所以位的不同不会影响数字对\(B-1\)的取模,换句话说,固定了选哪些数字之后,如何排列对取模后的答案没有影响。

  • 于是把每一位拆开看,假设一共有\(len\)个数位,第\(i\)位放的数为\(d_i\),则该数在\(B-1\)的剩余系下的答案为\(\begin{align}\sum_{i=0}^{len-1}d_i\times B^i\equiv \sum_{i=0}^{len-1}d_i\pmod{B-1}\end{align}\)

  • 于是直接将给出的数字求和,并对\(B-1\)取模,注意到数据有一个很好的性质,所有的数字至少有一个,所以直接将求和取模得到的数个数\(-1\)即可,注意如果取模答案为\(0\)并不需要减掉个数。

  • 然后构造答案的方法显然,因为要组成的数字最大,所以大的数字放前面,这样询问即可在个数上二分了。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
using namespace std; int f[N];
struct lim{int l,r;}s[N];
struct seg{int l,r,val;}p[N]; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} inline bool cmp1(lim x,lim y){return x.l==y.l?x.r<y.r:x.l<y.l;} inline bool cmp2(seg x,seg y){return x.r==y.r?x.l<y.l:x.r<y.r;} inline int find(int x){
int l=0,r=x-1;
while(l<r){
int mid=((l+r+1)>>1);
if(p[mid].r<p[x].l) l=mid;
else r=mid-1;
}
return l;
} int main(){
int n=rd(),tot1=0,tot2=0;
for(R int i=1,l,r;i<=n;++i){
l=rd(); r=rd();
if(l+r<n){s[++tot1].l=l+1;s[tot1].r=n-r;}
}
sort(s+1,s+1+tot1,cmp1);
for(R int i=1,cnt;i<=tot1;++i){
cnt=1;
while(s[i+1].l==s[i].l&&s[i+1].r==s[i].r) ++cnt,++i;
cnt=min(cnt,s[i].r-s[i].l+1);
p[++tot2].l=s[i].l; p[tot2].r=s[i].r; p[tot2].val=cnt;
}
sort(p+1,p+1+tot2,cmp2);
for(R int i=1;i<=tot2;++i)
f[i]=max(f[i-1],f[find(i)]+p[i].val);
printf("%d\n",n-f[tot2]);

[ POI 2017 ] Podzielno的更多相关文章

  1. yd的拔钉子之路之 POI 2017

    写在前面的一些话 如果我NOIP没退役,这大概会写成一个系列吧,所以这算是系列的开始,要写一些奇怪的东西? 首先解释下什么叫“拔钉子”,其实就是在钉子上做题嘛......至于钉子具体是个什么东西就当面 ...

  2. BZOJ 4726 POI 2017 Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  3. [ POI 2017 ] Sabota?

    Description 题目链接 Solution 因为一个节点染黑了子树就都被染黑了,所以最后染黑的点集必然是一棵子树. 可以得出的结论是,如果被染黑的节点在节点 \(a\) 的子树中,而 \(a\ ...

  4. Apache POI解析excel文件

    这里需要用到poi.jar和poi-ooxml.jar  没有的可以去http://mvnrepository.com/下载 import org.apache.poi.POIXMLDocument; ...

  5. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  6. Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)

    本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...

  7. poi入门之读写excel

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.该篇是介绍poi基本的 ...

  8. 位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 中国省市区查询:2017最新中国省市区地址 经纬度地址转换:经纬度 ...

  9. EXCEL上传POI

    Java SpringMVC POI上传excel并读取文件内容 2017年11月27日 15:26:56 强人锁男. 阅读数:15329   用的SSM框架,所需要的jar包如图所示:,链接地址:j ...

随机推荐

  1. JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分---https://blog.csdn.net/mathlpz126/article/details/80684034

    JSON.parseObject将json字符串转换为bean类,是否大小写敏感区分 https://blog.csdn.net/mathlpz126/article/details/80684034

  2. [luoguP2387] 魔法森林(LCT + 并查集)

    传送门 并查集真是一个判断连通的好东西! 连通性用并查集来搞. 把每一条边按照 a 为关键字从小到大排序. 那么直接枚举,动态维护 b 的最小生成树 用 a[i] + 1 ~ n 路径上最大的 b[i ...

  3. vim中256色的配色表

    vim貌似支持的颜色很有限.white  black  yellow  cyan   magenta   blue   grey   green   red,大多数颜色前面都可以加light 或者 d ...

  4. 洛谷—— P1339 [USACO09OCT]热浪Heat Wave

    P1339 [USACO09OCT]热浪Heat Wave 题目描述 The good folks in Texas are having a heatwave this summer. Their ...

  5. Maven项目pom.xml报错

    1.org.apache.maven.archiver.MavenArchiver.getManifest报错 pom.xml第一行报错,如图: 解决办法: 第一步: help ->Instal ...

  6. Ubuntu 16.04开机自动开启数字键盘NumLock

    注意:以下方法不适合在登录时开启,只能是登录后开启.而且我经过测试之后会自动暗下去,但是不影响功能使用.这个是BUG的修复方法:https://askubuntu.com/questions/5090 ...

  7. Ubuntu下常规方法安装软件

    一.通过apt-get 搜索: #搜索 apt-cache searche 7zip 安装: #安装 sudo apt-get install 7zip 更新: #查看特定软件的版本,前提是要安装ap ...

  8. Oracle中的 row_number() over (partition by order by ) 用法

    oracle 里面经常这样用 select col1,col2..., row_number() over (partition by colx order by coly) from table_n ...

  9. 移动智能设备功耗优化系列--前言(NVIDIA资深project师分享)

    本文是嵌入式企鹅圈原创团队成员.NVIDIA资深开发project师Terry发表的第一篇文章,其将对"移动智能设备功耗优化"这个专题展开一个系列的总结分享. Terry毫无保留地 ...

  10. FTP用户-禁止登录系统

    OS是Ubuntu 11.10. 1.   which nologin #/usr/sbin/nologin 2.   vim /etc/shells   #在该文件后添加/usr/sbin/nolo ...