B. Nastia and a Good Array
题意:给定一个长度为
n
n
n 的正整数序列
a
a
a。现在要对
a
a
a 进行操作。每一步操作可以任意选取两个整数
i
i
i 和
j
j
j
(
i
≠
j
)
(i \neq j)
(i=j) ,再任意取两个满足
m
i
n
(
a
i
,
a
j
)
=
m
i
n
(
x
,
y
)
min(a_i,a_j)=min(x,y)
min(ai,aj)=min(x,y) 的数
x
x
x,
y
y
y,然后把
a
i
a_i
ai 换成
x
x
x、
a
j
a_j
aj 换成
y
y
y。
求使得对于 1 < i ≤ n 1<i\leq n 1<i≤n 都满足 a i a_i ai 与 a i − 1 a_{i-1} ai−1 互质所需的最小操作次数以及操作方案。
思路:思考后发现性质:可以利用最小值 x x x 使得其他值 y y y 转化为大于等于 x x x 的任意数。那么可以使得 y y y 变为 x x x 或 x + 1 x+1 x+1 ,使得是序列交替的 x , x + 1 x,x+1 x,x+1,因为相邻的整数都互质,即可满足题意。
AC代码:https://codeforces.com/contest/1521/submission/153254165
D. Game With Array
题意:给出两个数 N , S N,S N,S,问是否可以找到一个正序列和一个数 K ( 0 < = K < = S ) K(0<=K<=S) K(0<=K<=S) ,满足:存在一个长度为 N N N ,和为 S S S 的序列,在其中找不到一个子段的和为 K K K 或者 S − K S-K S−K 。
如果存在构造,输出 YES 以及找到的序列还有
K
K
K。
否则,输出 NO。
思路:看的题解。证明不会。
AC代码:https://codeforces.com/contest/1355/submission/153285482
D. Non-zero Segments
题意:可以在给定序列中任意位置插入任意大的数,问最少插入多少个数使得序列不存在和为 0 的子区间。
思路:转化为前缀和也就是:问最少插入多少个数使得任意两两相同的元素之间都有插入的元素。我们枚举右端点,观察数字相同的左端点,发现可能有很多个左端点,但是只需要拆掉最近的左端点即可,其他左端点也会被拆掉。转化为经典的贪心:区间选点问题。
AC代码:https://codeforces.com/contest/1426/submission/153255511
C. Game with Chips
题意:见 洛谷 翻译。
思路:先缩到一个点,再遍历即可。
AC代码:https://codeforces.com/contest/1327/submission/153279060
D. Soldier and Number Game
题意:给你 a , b ( 1 < = b < = a < = 5000000 ) a,b(1<=b<=a<=5000000) a,b(1<=b<=a<=5000000) 表示你有一个数 a ! b ! \frac {a!}{b!} b!a!,你每次可以对 这个数除以 x ( x > 1 x(x>1 x(x>1 且 x x x 为这个数的因子)。 问你最多可以操作多少次使这个数变成 1。
思路:板子题,阶乘的质因数分解。有两种方法:
- 欧拉筛筛出 1 1 1 ~ 5000000 5000000 5000000 每个数的质因子个数,然后前缀和即可。( O ( n ) O(n) O(n) 预处理 O ( 1 ) O(1) O(1) 查询)
- 求 n ! n! n! 的质因子个数,详见 AcWing 197. 阶乘分解题解 。( O ( n ) O(n) O(n) 查询)。这个方法用来求阶乘某个质因子的次数还差不多,可以做到 O ( log n ) O(\log n) O(logn) ,暴力的话是 O ( n × s q r t ( n ) ) O(n \times sqrt(n)) O(n×sqrt(n))。
AC代码:https://codeforces.com/contest/546/submission/153274619