【Coin】:
【题目大意】:N种不同面额的硬币。每种硬币有无线多个。要用这些硬币拼凑出面值M,最少要花费多少枚硬币。多组询问。1<=n<=100,1<=ai<=1000,1<=M<=10`16,1<=T<=10`5
【解题思路】:对于30%的数据,有1<=M<=10`6,所以可以用时间复杂度为O(NM)的DP来拿分,大概是DP[I]=DP[I-A[J]]+1
对于全部的数据,我们知道DP[I+A[J]]与DP[I]的差值小于或等于1,则当面值很大的时候,DP值可能形成以最大面额为周期的循环。既先预处理10`7的DP,然后超过10`7部分O(1)解决。
【Euler】:
【题目大意】:已知y,求最小的自然数x满足phi(x)=y(phi为欧拉函数),y<=10`12
【解题思路】:本题是本人认为在这套题中最难的一道题。我们可以得到以下式子:(pi为连乘,括号中为范围)
y=phi(x)=x*pi(1-1/p[i]) (1<=i<=n)
x=pi(p[i]`c[i])
y=(p[i]-1)*p[i]`(c[i]-1)
所以我们预处理出每个满足以下条件的因数:
Q是y的因数,且Q+1是一个质数
得到如此一类因数后(假设有CNT个),我们可以的到DP状态
DP[I][S]表示取到第I个质数,累积给Y的大小为S,得到的最小的X
最后答案则为DP[CNT][Y],对于时间复杂度的担心是不必要的,官方题解给了以下几个数据:
1.y <= 1012 的约数不超过 6720 个(963761198400)。
1.实际上(测试数据中),x 的可能质因子不超过 2000 个。
【Triple】
【题目大意】:n个数。问对每个ai有多少组aj+ak+al=ai,且i–d < j <= k <= l < i。其中d是常数。数据范围:d <= n <= 5 000, |ai| <= 106.
【解题思路】:对于30%的数据有N<=200,推断是用O(N`3)的时间复杂度来做,动态维护一个数组,计算合法范围内,两两之和的情况以及三三之和的情况,计算答案。对于全部数据,可以动态维护两个表, hashOne[] 记录数值为 x 的数的个数。hashTwo[] 记录两个数之和为 x 的数的个数。
枚举 j,ans += hashTwo[ai - aj] + hashOne[ai – 2*aj]
或许需要去重?我们可以凑成答案的3倍,注意特判选了两个aj以及三个aj的情况。
【总结】:这套题目做得很惨,其实题目的实现比较简单,关键是思考的过程,以及一些思考的方向。如:第一题应该想到大数据的一些特殊性(以前做过一道相似的题目);第二题,数据的大小对于题目的解法的影响;第三题:去重的方法,可以通过凑整数倍,再缩倍。
【需要加强的地方】:数论知识