ALL:6
AC:2
补题:2
Rank:2958
C. Strange Function
题意:定义 f ( i ) f(i) f(i) 表示最小的正数满足不是 i i i 的因子。给定 n ( 1 ≤ n ≤ 1 0 16 ) n(1\leq n\leq 10^{16}) n(1≤n≤1016) ,求 ∑ i = 1 n f ( i ) \sum_{i=1}^n f(i) ∑i=1nf(i) 。
思路:假设 x x x 是 i i i 的最小非因子,那么一定有 lcm ( 1 , 2 , ⋯ , x − 1 ) ∣ i \text{lcm}(1,2,\cdots ,x-1)\mid i lcm(1,2,⋯,x−1)∣i ,且 x ∤ i x\nmid i x∤i 成立。要求只满足第一条式子的数字个数,整除一下即可。如果还需要满足第二个条件,容斥一下即可。
AC代码:https://codeforces.com/contest/1542/submission/178903704
D. Priority Queue
题意:
给定一个序列
A
A
A,
A
A
A 的每一个元素形如 + x
和 -
,其中
x
x
x 为一个整数。
对于一个每个元素都形如 + x
和 -
的序列
S
S
S,按如下方式计算
f
(
S
)
f(S)
f(S) 的值:
-
你需要依次遍历 S S S 中的元素,并且维护一个可重集 T T T。
-
对于每个 S S S 中的元素,若其为
+ x
,那么就将 x x x 加入 T T T,否则就删除 T T T 最小的数。特别的,若 T T T 中没有数,那么就不进行删除操作。 -
在遍历完 S S S 中的元素后,将可重集 T T T 中所有数的和 s u m sum sum 算出来。 s u m sum sum 即为 f ( S ) f(S) f(S) 的值。
定义 b b b 是 a a a 的子序列当且仅当 b b b 是由 a a a 在不改变原有顺序的情况下删除若干元素得到的。现在对于 A A A 的所有子序列 B B B,蓝想让你求出 f ( B ) f(B) f(B) 的和模 998244353 998244353 998244353 的值。
本题有
1
≤
n
≤
500
1 \leq n \leq 500
1≤n≤500,并且对于每个形如 + x
元素中的
x
x
x,有
1
≤
x
<
998244353
1 \leq x < 998244353
1≤x<998244353。
思路:这是一道细节很多的 DP 题。
考虑求每个数字 x = a k x=a_k x=ak 的贡献次数,即出现在了多少个子序列中。
设 d p ( i , j ) dp(i,j) dp(i,j) 表示前 i i i 个数的所有可重子集(包括 x x x ,表示为 { a d ∣ d ∈ [ 1 , i ] , d ≠ k } ∪ { x } \{ a_{d} |d\in[1,i],d\neq k \} \cup \{x\} {ad∣d∈[1,i],d=k}∪{x} )中,有 j j j 个小于 x x x 的数字的序列个数。
DP 方程及推导详见题解。提几个要注意的细节。
- 对于 o p i = − op_i=- opi=− 的情况,当 i < k , j = 0 i<k,j=0 i<k,j=0 时,要多转移一个,而 i > k , j = 0 i>k,j=0 i>k,j=0 时不能多转移(因为要考虑操作该 o p op op 时 a k a_k ak 是否在集合中)。
- 对于 o p i = + op_i=+ opi=+ 的情况,如果 a i = a k a_i=a_k ai=ak ,为了避免算重算漏,把 i < k i<k i<k 归到一类转移,把 i > k i>k i>k 归到另一个转移。
AC代码:https://codeforces.com/contest/1542/submission/178906123