2014.8.11 2014年北京市信息学集训队 结业考试

【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的情况。


【总结】:这套题目做得很惨,其实题目的实现比较简单,关键是思考的过程,以及一些思考的方向。如:第一题应该想到大数据的一些特殊性(以前做过一道相似的题目);第二题,数据的大小对于题目的解法的影响;第三题:去重的方法,可以通过凑整数倍,再缩倍。

【需要加强的地方】:数论知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值