模拟43 题解

A. A

发现不断加a,乘b。

枚举将s乘k次b,则有

$t=s*b^k+\sum \limits_{i=0}^{k-1}used[i]*a*b^i$

答案即是使得$\sum \limits_{i=0}^{k-1}used[i]$最小的方案。

将s,t表示为b进制会比较好算。

当a=1时,贪心地选择就可以了。

然后a!=1就不会打了。

其实将差值除一个a,问题就转化为了a=1的问题。

 

 

 

B. B

通过打表发现一些性质:

若$gcd(i,p)=gcd(j,p)$,则$ans(i)=ans(j)$。

在数据范围$p<=1e9$内,p最多只有不到两千个因子。

所以将p个数分为因子个数个组,

每个组中的每个元素与p的gcd相同,设为k,

则取k为这个组的代表元素,这个组的元素个数为$phi(p/k)$。

所以直接将最暴力$O(n*p^2)$的dp改为$O(n*d(p)^2)$,$d(x)$为x的约数个数。

 

 

 

C. C

最近做了很多关于区间覆盖的题,然而都没有做出来。

大致思路都是将这些区间先按左端点排序。

同理,本题排序后贪心。

因为本题中有一个很关键的性质:每个区间的权值都为1。

所以从左到右考虑每个点,取得跨过这个点的右端点最靠右的区间就可以了。

然而有一个特殊的区间,处理方式是枚举选特殊区间多少次。

这个复杂度是有问题的,所以考虑三分选的次数,就可以了。

 

posted @ 2019-09-15 19:38  skyh  阅读(199)  评论(1编辑  收藏  举报