正题

题目链接:https://www.luogu.com.cn/problem/P5956


题目大意

\(B\)进制下,给出序列\(a\),\(a_i\)表示数字\(i\)有多少个。求一个最大的\(X\)在\(B\)进制下,由给出的数字组成(不一定要用完),且其是\(B-1\)的倍数。

\(q\)次询问\(X\)的第\(k\)位是几。

\(2\leq B\leq 10^6,1\leq q\leq 10^5,1\leq a_i\leq 10^6,0\leq k\leq 10^{18}\)


解题思路

设\(x_i\)表示第\(i\)位的话就是

\[\left(\sum_{i=0}x_i\times B^i\right)\%(B-1)=0\Rightarrow \sum_{i=0}\left(x_i\times B^i\%(B-1)\right)=0
\]

拆开单独的一个来看

\[x_i\times B^i\%(B-1)=(\ x_i\%(B-1)\ )\times (\ B^i\%(B-1)\ )
\]
\[=x_i\%(B-1)\times 1
\]

所以其实就是各位数字的和为\(B-1\)的倍数就好了。

然后再回头看题目发现有限制\(a_i\geq 1\)。这样如果用上所有数字的和对\(B-1\)取模为\(t\)的话,若\(t\)不为\(0\),我们就让\(a_t\)减去一个\(1\)就好了。

然后对于询问求一个前缀和然后二分

时间复杂度\(O(B+q\log B)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6+10;
ll B,q,a[N];
signed main()
{
scanf("%lld%lld",&B,&q);
ll t=0;
for(ll i=0;i<B;i++){
scanf("%lld",&a[i]);
(t+=a[i]*i)%=B-1;
}
if(t)a[t]--;
for(ll i=0;i<B;i++)a[i]+=a[i-1];
while(q--){
ll x;scanf("%lld",&x);x++;
if(x>a[B-1])puts("-1");
else printf("%lld\n",lower_bound(a,a+B,x)-a);
}
return 0;
}

P5956-[POI2017]Podzielno【数学】的更多相关文章

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

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

  2. BZOJ4724 [POI2017]Podzielno

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

  3. bzoj 4724 [POI2017]Podzielno 二分+模拟

    [POI2017]Podzielno Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 364  Solved: 160[Submit][Status][ ...

  4. BZOJ 4724: [POI2017]Podzielno

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

  5. 【bzoj4724】[POI2017]Podzielno 二分

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

  6. 数学思想:为何我们把 x²读作x平方

    要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...

  7. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  8. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  9. BZOJ 4726: [POI2017]Sabota?

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

随机推荐

  1. 简单介绍无限轮播图,js源代码

    无限轮播图js源代码,今天介绍一下用js简单的编写无限轮播图 <!DOCTYPE html> <html>   <head>     <meta charse ...

  2. Redis3.0.0集群一键脚本 -by古斌

    下载地址(以交由码云托管): https://gitee.com/gubin0412/Redis3.0.0 赋予脚本执行权限  chmod +x redis-gubin.sh 使用 ./redis-g ...

  3. 使用javascript纯前端导出excel

    前言(感谢技术的分享者) 参考博客地址 github地址 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx ...

  4. Java String.split()的特殊用法

    1 //用多种字符分隔字符串 2 public class Main { 3 /* 4 * "(1,2),(2,4),(3,6),(4,7)"按[(),]分隔 5 * 空白(1,2 ...

  5. Android:绘制字符

    根据FontMetrics的特点,将字符在矩形框中居中显示:

  6. 深入研究webpack之Tree Shaking相关属性sideEffects用处

    Tree Shaking我原来也只是了解,这次碰巧深入研究了下,就写个博客记录一下,网上有很多讲Tree Shaking的,我写的这篇跟他们侧重点不一样 Tree Shaking相关的基础知识 1 w ...

  7. cmd关闭端口占用

    netstat -nao |findStr "8080" taskkill /pid 15406  /f

  8. VS2017 创建并测试 C++ dll

    生成DLL 创建工程: Create new project -> 选择Visual C++ -> Windows Desktop -> Dynamic-Link Library ( ...

  9. oracle基础知识及语法

    ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约 ...

  10. Python网编之简单的聊天小程序

    服务端: import socket sock = socket.socket() sock.bind(("127.0.0.1",8899)) sock.listen(5) whi ...