「AGC047」口胡(F 不会)

晚上八点被同学拐去上班会课没打。

搞得好像你 rating 有 1200 了一样

搞得好像你 rating 到了就能做的出来一样

为什么感觉这场 AGC 很不 AGC 风啊(都来多项式了)。

A

Description

给出 (n) 个小数位数不大于 (9) 个数,求有多少对数相乘为整数。

Solution

只要看每个数因子 (2)(5) 出现了几次就可以了。

Code

B

Description

给出 (n) 个字符串,求有多少对字符串满足第一个串通过每次删除开头两个字符之一得到第二个串。

Solution

一个串可以生成出来的串一定是一段后缀加上前面一个字符。于是把串反转以下插到 Trie 里面统计一下就可以了。

注意减掉自己和自己的重复贡献。

Code

C

Description

(sum_{i<j}(a_i a_j mod p))

Solution

[f_x = sum_i[a_i=x],g_{xy}=f_xf_y ]

求出 (g_{xy}) 就游 戏 结 束了,答案就是 (frac{sum_i (i mod p)g_i - sum_i a_i^2mod p}2)。不过 (xy) 的值可能很大,考虑取对数,然后就变成一个卷积的形式了。

Code

D

Description

给出两棵完全二叉树,求 (sum_{i,j~is~leaf}operatorname{val}_{ ext{T1}}(i,j)operatorname{val}_{ ext{T2}}(p_i,p_j))

其中 (operatorname{val}_{ ext{T1}},operatorname{val}_{ ext{T2}}) 分别表示在第一棵,第二棵树上的权值。权值定义为两点间路径上所有点标号的乘积。

Solution

在第一棵树上枚举 ( ext{LCA}),考虑跨越左右子树的贡献。对第二棵树上涉及到的点建虚树,在树上 dp 即可。

具体实现的时候,因为是完全二叉树,可以用类似 Trie 的方法来做。

Code

E

Description

你有一个数组 (a),初始时 (a_0 = A, a_1 = B),你要通过以下操作使得 (a_2 = A imes B)

1.+ i j k,令 (a_k = a_i + a_j)
2.< i j k,令 (a_k = [a_i < a_j])

数组长度 (2 imes 10^5),操作次数 (2 imes 10^5),中间值不能超过 (10^{19})

Solution

这个 1800 pts 也太假了吧

首先如果 (A = B = 0),不管怎么操作所有地方都是 (0),可以不用管这种情况。

把过程分为 (3) 步。

  • 处理出 (2) 的次幂
    • 我知道这很傻但是这是唯一卡住我的地方。
    • 注意到有 (2A + 2B > B),这样就可以搞出 (1) 了,然后一直自加就可以处理出 (2^0,ldots,2^{30}) 了。
  • 分离 (A, B) 的二进制位。为了方便,这里只叙述对于 (A) 的情况。
    • 记录一个临时变量 (A1),表示 (A)(2^{30},ldots,2^{i+1}) 这些位置的和,那么第 (i) 位为 (1) 等价于 (A1 + 2^i leq A),也即 (A1 + 2^i < A + 1),这样就能提取出第 (i) 位的值了。注意每次提取完更新一下 (A1) 的值。
  • (1 imes 1)
    • 这个挺简单的吧 (a imes b=1iff a+b=2),然后就只要和 (1) 比大小然后不断自加就可以了。

代码里应该有很多可以优化的地方,不过它没有卡就懒得想了。

Code

原文地址:https://www.cnblogs.com/realSpongeBob/p/AGC047.html