[POI2017]Podzielno

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 364  Solved: 160
[Submit][Status][Discuss]

Description

B进制数,每个数字i(i=0,1,...,B-1)有a[i]个。你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要
用完所有数字),使得X是B-1的倍数。q次询问,每次询问X在B进制下的第k位数字是什么(最低位是第0位)。

Input

第一行包含两个正整数B(2<=B<=10^6),q(1<=q<=10^5)。
第二行包含B个正整数a[0],a[1],a[2],...,a[B-1](1<=a[i]<=10^6)。
接下来q行,每行一个整数k(0<=k<=10^18),表示一个询问。

Output

输出q行,每行一个整数,依次回答每个询问,如果那一位不存在,请输出-1。

Sample Input

3 3
1 1 1
0
1
2

Sample Output

0
2
-1

HINT

 

题解:

一个B进制数+B-1后各位数字之和模B-1意义下不变

证明:+B相当于在次低位+1,-1相当于在最低位-1,

如果某一位加一,如果进位,则下一位会加一,这一位会减去B-1,所以对各位数字之和模B-1意义下的影响是+1

如果某一位减一,如果退位,则下一位会减一,这一位会加上B-1,所以对各位数字之和模B-1意义下的影响是-1

所以原数+B-1后各位数字之和在模B-1意义下不变

那么显然一个B进制数是B-1的倍数的充要条件是各位数字之和模B-1等于0

题里要求让这个数尽量大

那么我们就先把所有数都选上,并且大的数放到高位,然后删去尽量少的数

因为a[i]>=1,所以直接删除即可。

 #include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio> #define ll long long
#define N 1000007
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m;
ll a[N]; int main()
{
n=read(),m=read();
ll x=;
for (int i=;i<n;i++)
a[i]=read(),(x+=a[i]*i)%=(n-);
if (x) a[x]--;
for (int i=;i<n;i++) a[i]+=a[i-];
while(m--)
{
x=read()+;
int ans=-,l=,r=n-;
while(l<=r)
{
int mid=(l+r)>>;
if (a[mid]>=x) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
}
}
 

bzoj 4724 [POI2017]Podzielno 二分+模拟的更多相关文章

  1. BZOJ 4724: [POI2017]Podzielno

    Description 由\([0,B-1]\)的数字构造一个 \(B\) 进制数字,使得他是 \(B-1\) 的倍数. Sol 贪心+二分. 首先 \(X\) 是 \(B-1\) 的倍数,那么有 \ ...

  2. bzoj 4723 [POI2017]Flappy Bird 模拟

    [POI2017]Flappy Bird Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 482  Solved: 196[Submit][Status ...

  3. 【bzoj4724】[POI2017]Podzielno 二分

    题目描述 B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要用完所有数字),使得X是B-1的倍数.q次询问,每次询问X在B进制 ...

  4. BZOJ4724 [POI2017]Podzielno

    4724: [POI2017]Podzielno Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 77  Solved: 37[Submit][Stat ...

  5. 【BZOJ4724】[POI2017]Podzielno 数学+二分

    [BZOJ4724][POI2017]Podzielno Description B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零, ...

  6. Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟

    A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. bzoj 2527 Meteors - 整体二分 - 树状数组

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  8. bzoj 3993 星际战争 - 二分答案 - 最大流

    3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值减少到0或者 ...

  9. 2018ICPC青岛 E - Plants vs. Zombies (二分+模拟)

    ZOJ - 4062 题意:有n个植物排成一排,按顺序植物的编号是1-n,每个植物都有一个生长速率,有一个机器人,机器人可以走m步,每走一步,这个机器人就会浇一次水,浇一次水那个植物就会长 自身的生长 ...

随机推荐

  1. 出现java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.web.visit.main.ClickVist$VisitMapper.<init>()的问题

    执行mapreduce报错java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.w ...

  2. win32绘制自定义类窗口导致绘制11个窗口的解决办法

    上网查了一圈也没有找到解决问题的办法,一旦创建了一个窗口,并且在过程函数中绘制窗口,尤其是一些非子窗口的自定义类窗口,都会生成11个窗口(算上主窗口就是12个),但是使用系统通用控件就不会有这种情况的 ...

  3. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  4. tensorflow学习笔记(3)前置数学知识

    tensorflow学习笔记(3)前置数学知识 首先是神经元的模型 接下来是激励函数 神经网络的复杂度计算 层数:隐藏层+输出层 总参数=总的w+b 下图为2层 如下图 w为3*4+4个   b为4* ...

  5. POJ 2449 Remmarguts' Date(第k短路のA*算法)

    Description "Good man never makes girls wait or breaks an appointment!" said the mandarin ...

  6. CentOS Openvpn搭建以及 linux&&windows客户端的连接

    本文参考:http://www.centoscn.com/CentosServer/test/2014/1120/4153.html 一. Server安装准备     (CentOS release ...

  7. 什么是Frozen Binary

    对于Python来说,你可以将Python的字节码,PVM(也就是解析器),以及需要的相关类库,打包成一个package,这个package实际上是一个二进制可执行文件,这样,用户获取到这个packa ...

  8. python学习笔记03:python的核心数据类型

    从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Py ...

  9. lintcode-6-合并排序数组

    合并排序数组 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 挑战 你能否优化你的算法,如果其中一个 ...

  10. <Effective C++>读书摘要--Designs and Declarations<一>

    <Item 18> Make interfaces easy to use correctly and hard to use incorrectly 1.That being the c ...