Dirchlet后缀和的应用 Codeforces 1614D2

Dirchlet前缀和和Dirchlet后缀和基础知识可以查阅blog学习一下,以前一直用不知道叫这名……其实本质也就是质因数分解以后指数的高维前缀和……
cnt[i]表示{a[i]}中i的倍数的个数,dp[i]表示选出i的倍数的数,前缀gcd的和最大是多少
显然前缀gcd一定是前一个前缀gcd因子,所以dp[i]要么等于i * cnt[i]要么一定存在某个位置前缀gcd为j,使得j为i的倍数,dp[i]=max{dp[j]+i*(cnt[i]-cnt[j])},一定是前面gcd是个i倍数,后面填了一些i的倍数非j的倍数使得gcd缩小为i
b [ a [ x ] ] = 1 , c n t [ i ] = ∑ i ∣ j b [ j ] b[a[x]]=1, cnt[i]=\sum_{i | j}{b[j]} b[a[x]]=1,cnt[i]=ijb[j] 这是很标准的Dirchlet后缀和形式
d p [ i ] = min ⁡ i ∣ j ( d p [ j ] + i ∗ ( c n t [ i ] − c n t [ j ] ) ) dp[i]=\min_{i|j}{(dp[j]+i*(cnt[i]-cnt[j]))} dp[i]=ijmin(dp[j]+i(cnt[i]cnt[j])) ,是不是感觉很像,求和与取min都满足,同样做法 O ( V l o g l o g V ) O(V loglogV) O(VloglogV)
最后 输出任意 d p [ i ] { i ∣ g c d ( a [ 1 ] , a [ 2 ] . . . a [ n ] ) } dp[i]\left\{ i|gcd(a[1],a[2]...a[n]) \right\} dp[i]{igcd(a[1],a[2]...a[n])},直接dp[1]就行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值