A. Social Distancing
题目描述:
在一个半径为 $ r $ ,圆心为 $ (0, 0) $ 的圆内整点放置 $ n $ 个人,使得两两距离的平方和最大
数据范围:
$ 1\le T \le 250 $
$ 1\le n \le 8, 1\le r \le 30 $
题解:
居然是个 $ dp $ 题。考虑使用 $ dp $ 打表, $ dp[i][j][k] $ 为放置了 $ i $ 个点,横坐标和为 $ j $ ,纵坐标和为 $ k $ 的情况下的答案。
维护第一项的值,枚举 $ j,k $ 去更新 $ dp $ 值,用数组 $ ans[i][r] $ 来更新在半径为rr的圆,放置了 $ i $ 个点的答案, $ ans[i][r]=max\{i×dp[i][j][k]−j^2−k^2\} $
打一下表,直接输出就行
代码:
打表
1 |
|
得到数据输出
1 |
|
B. Mask Allocation
题目描述:
$ n \times m $ 个物品怎么分配打包,可以随意将包裹组合得到 $ n $ 组每组 $ m $ 个和 $ m $ 组每组 $ n $ 个
数据范围:
$ 1\le T \le 100 $
题解:
看到这组就应该知道需要递推了,可怜我还在不断的尝试。其实也快想到正解了。我构造的也是前面 $ m - m \% n $ 个 $ n $ ,后面的搞错了直接填上 $ n $ 个 $ m\%n $ 了,没有看到是递推的。
代码:
1 |
|
C.
题目描述:
数据范围:
题解:
代码:
1 |
D. Fake News
题目描述:
前 $ n $ 项平方和是否是一个完全平方数
数据范围:
$ 1\le T \le 10^6 $
$ 1\le n \le 10^{15} $
题解:
实测 $ python $ 在输入输出情况下, $ 1s $ 跑不完 $ 1e6 $ ,甚至跑不完 $ 1e5 $
只有为 $ 1 $ 和 $ 24 $ 才是。果然推公式就会白给
代码:
1 |
|
E.
题目描述:
数据范围:
题解:
代码:
1 |
F.
题目描述:
数据范围:
题解:
代码:
1 |
G.
题目描述:
数据范围:
题解:
代码:
1 |
H. Dividing [除法分块]
题目描述:
定义 legend tuple
- $ (1, k) $ $ true $
- $ (n, k) $ $ -> $ $ (n+k, k), (n\times k, k) $
给出 $ N, K $ 求出有多少组 $ (n,k) $ $ 1\le n \le N, 1\le k \le K $
数据范围:
$ 1\le N, K \le 10^{12} $
$ \mod{1e9 + 7} $
题解:
只有一组数据,只是数据比较大。对 $ k $ 进行分组, $ [1,K] $ ,对于每个 $ k $ 求出在 $ N $ 内有多少组。满足 $ n\%k == 1 || n\%k == 0 $
使用除法分块 $ \sqrt{n} $ 计算这个求和
1 | ll divfloor(ll n, ll k) |
计算 $ \sum_{k = 2}^{K}\lfloor \frac{N}{k} \rfloor $ 使用上面的除法分块方法。分成每个区间去求,每个区间内的 $ \lfloor \frac{N}{k} \rfloor $ 全部一样
$ l $ 区间左端点,则这段区间的值为 $ \lfloor \frac{N}{l} \rfloor $ ,下面需要求区间右端点。结果仍为 $ \lfloor \frac{N}{l} \rfloor $ 的最大的 $ l $ 即为右端点 $ r $ 。记 $ \lfloor \frac{N}{l} \rfloor $ 为 $ x $
即:
而且 $ y_2 $ 一定是最小的一个了。 $ y_1 \ge x $ 说明可以抽出几个 $ x $ 放到 $ l $ 中得到 $ r $ ,所以可以明显看出 $ r = \lfloor \frac{N}{x} \rfloor $ ,下一个区间的左端点为 $ r + 1 $
由于 $ k \gt N $ 时全是 $ 0 $ ,所以直接取 $ min $ ,不考虑那一部分了
代码:
1 |
|
I.
题目描述:
数据范围:
题解:
代码:
1 |
J. Pointer Analysis
题目描述:
一个程序中有 $ 26 $ 个对象, 每个对象有 $ 26 $ 个成员指针变量. 同时还有 $ 26 $ 个普通的指针变量. 给定 $ n $ 条赋值语句, 询问在以任意顺序执行每条语句无限多次的过程中, 每个指针变量可能指向的对象集合.
数据范围:
$ 1\le N \le 200 $
题解:
大模拟
直接暴力求解,只有这四种情况,每种情况遍历一遍判断一下。
使用 $ ans[i][j] $ 用来记录大写字母对应的对象,使用 $ int $ 直接进行或运算就可以传递。使用 $ a[i][j][k] $ 用来表示成员变量对应的大写字母对应的对象
读入的时候使用 $ \%*s $ 可以规避一些字符
代码:
1 |
|