A

用计算器式显示数字,可以显示 \(n\) 段。可以显示的最大数字是多少?

如果用了一个需要至少四段的数字,一定不如把这个替换成两个 \(1\) 好。

如果一共可以用偶数个,一定是全部 \(1\)。

如果一共可以用奇数个,一定是开头一个 \(7\),之后全是 \(1\)。

B

给定一个 \(01\) 序列 \(s\) 和 \(k\),\(t\) 为 \(s\) 的无限重复。求 \(x\) 的个数,\(x\) 满足:\(t\) 的前 \(x\) 个元素中的 \(0\) 的个数减 \(1\) 的个数等于 \(k\).

令 \(balance(len)=cnt_{0,len}-cnt_{1,len}\)。

注意到 \(balance(len)=[\frac{len}{n}]\times balance(n)+balance(len\mod n)\).

而 \(balance(0\sim n)\) 可以预处理出来。

我们只需要枚举 \(i=0\sim n-1\),判断 \(x-balance(i)\) 是否为 \(balance(n)\) 的倍数即可。

注意,不仅要判断倍数,还要判断 \(\dfrac{x-balance(i)}{balance(n)}\) 是否非负!!!

C

老套路题。

记 \(nxt_{pos,ch}\) 为从 \(pos\) 号位置开始,下一个 \(ch\) 在哪里出现。

一个贪心:如果遇到一个能匹配当前字符的,就一定要配上。

D

给定 \(a,m\),求所有 \(x\) 满足 \(gcd(a+x,m)=gcd(a,m)\).

\(gcd(a+x,m)=gcd(a,m)\),不妨令 \(x'=(a+x)\% m\),这样 \(gcd(a+x,m)=gcd(x',m).\)

于是现在的问题转化为:\(gcd(x',m)=gcd(a,m),x'\in [0,m).\)

设 \(gcd(a,m)=g,a=a'g,m=m'g\),因为 \(gcd(x',m)=g\),则 \(x'=x''g\)。

此时应有 \(gcd(x'',m')=1,x''\in[0,m')\),而每一个与 \(m'\) 的 \(gcd\) 等于 \(1\) 的数,都可以唯一对应到原问题中的 \(x\)。

这时问题转化为求 \(0\sim m'-1\) 中和 \(m'\) 互质的数的个数,发现 \(1\sim m'-1\) 的个数就是 \(\varphi(m')\)。

而 \(gcd(0,m')=1\) 是否成立还要看 \(m'=1\),但是 \(m'=1\) 说明 \(m=g\) 说明 \((a,m)=m\) 说明 \(m\mid a\) 说明 \(a\geq m\) 矛盾。

所以答案就是 \(\varphi(m')\).

E

给定一个 \(1\sim n\) 的排列 \(p\) 和一个花费数组 \(a\)。

可以选一个 \(k\in [1,n-1]\) 把 \(p\) 分成两半:\(p_{1\sim k},p_{k+1\sim n}\).

可以选择这两组中的一些元素移动到另外一组,第 \(i\) 个元素的移动代价是 \(a_i\)。

经过一些移动后,要求第一组中所有元素都小于第二组中所有元素。如果某一组空了,也满足条件。

求最小代价和。


枚举 \(k=0\sim n\),表示最终我们希望 \(1\sim k\) 在第一组中。

令 \(t[i]\) 表示此时把排列分成 \(1\sim i-1,i\sim n\) 两段的最小代价。(此时就是当我们枚举 \(k\) 时 \(k\) 每变一次都求一次)

对于 \(k=k'\) 时,\(t[i]=\)(\(p[1]\sim p[i-1]\) 中不属于 \(1\sim k'\) 的元素的代价之和)+(\(p[i]\sim p[n]\) 中属于 \(1\sim k'\) 的元素的代价之和),这时我们知道,如果要 \(1\sim k'\) 在第一组,答案就是此时的 \(\min(t[2],\dots,t[n])\)。

现在的问题在于,我们不能对每一个 \(k\) 都求一次 \(t\) 数组,复杂度会爆。

我们发现,当 \(k\) 加 \(1\) 时,变化其实很少:\(t[2]\sim t[pos[k+1]]\) 都 \(+a[pos[k+1]]\),\(t[pos[k+1]+1]\sim t[n]\) 都 \(-a[pos[k+1]]\)。\(pos[k+1]\) 表示在排列中 \(k+1\) 的位置。

这是因为如果我们要让 \(k+1\) 去第一组,那所有初始没有包含 \(k+1\) 的分法,也就是在 \(2,\dots,pos[k+1]\) 分开的方法,都需要额外花 \(a[pos[k+1]]\) 的代价把 \(k+1\) 放到左边。

这可以用线段树维护。区间加 + 区间最小值(求 \(t\) 的最小)。

随机推荐

  1. P1032

    写这道不算难的题目是我遇到了不少问题,复述以下过程吧. 由于数据很水,这道题用不到KMP算法,只要使用朴素算法进行字符串比对就可以了. 1 首先,我错误的选择了dfs算法,导致了TLE的发生.这类求最 ...

  2. freeswitch查看所有通道变量

    概述 freeswitch 是一款好用的开源软交换平台. 实际应用中,我们经常需要对fs中的通道变量操作,包括设置和获取,set & get. 但是,fs中有众多的内部定义通道变量,也有外部传 ...

  3. html - 多次点击选中页面文字出现蓝色背景的解决方法

    body{ -moz-user-select: none; /*火狐*/ -webkit-user-select: none; /*webkit浏览器*/ -ms-user-select: none; ...

  4. Go-数组-实现队列

    package main import ( "errors" "fmt" ) // 队列 // 特征: // 1. 按照元素的添加顺序排序,并且容量固定 // ...

  5. [转帖]ASH、AWR、ADDM区别联系

    ==================================================================================================== ...

  6. [转帖]Linux中的inode到底是什么

    https://www.jianshu.com/p/6aa4d7ef17de inode 是什么? 要了解 Linux 操作系统上的 inode 前,我们先来说说 Linux操作系统上的文件.对于 L ...

  7. [转帖]Django系列3-Django常用命令

    文章目录 一. Django常用命令概述 二. Django常用命令实例 2.1 help命令 2.2 version 2.3 check 2.4 startproject 2.5 startapp ...

  8. [转帖]linux shell 脚本一些主要知识点整理

    文章目录 一./bin/sh 与 /bin/bash 的区别 二.vi与vim的区别 三.shell变量 四.Shell字符串 五.Shell函数 六.Shell基本运算符 1.Shell expr: ...

  9. [转帖]15 个必须知道的 chrome 开发工具技巧

    在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用console和 ...

  10. SpringBoot 连接Oracle 12c 以上版本PDB的解决思路

    1. 最近公司产品改用springboot开发, 要支持企业级大型数据库Oracle ,并且版本要求比较高,需要使用Oracle12c以上. 又因为Oracle 12c 以上有了一个PDB的可插拔数据 ...