HDU-5514、Frogs (容斥)

题目链接

题面:
在这里插入图片描述
题意:
有一个长度为 m m m 的环,编号为 [ 0 , m − 1 ] [0,m-1] [0,m1],有 n n n 只青蛙在 0 0 0 号点处,第 i i i 只青蛙每次可以从 k k k 号点跳到 k + a [ i ] k+a[i] k+a[i] 号点,现在这 n n n 只青蛙可以跳跃无穷次,问最后哪些点被青蛙曾经跳进去过。

题解:
很明显,第 i i i 只青蛙只会跳 g c d ( a [ i ] , m ) gcd(a[i],m) gcd(a[i],m) 那些点,我们令 a [ i ] = g c d ( a [ i ] , m ) a[i]=gcd(a[i],m) a[i]=gcd(a[i],m),现在转化为每只青蛙每次跳过 a [ i ] a[i] a[i] 个位置,其中 a [ i ] a[i] a[i] m m m 的因数,最终有多少个位置会被跳过。

我们将 a [ i ] a[i] a[i] 排序后去重,现在 a [ i ] a[i] a[i] 大约有 2 e 3 2e3 2e3 个。

其实是可以容斥做的,当时做的时候容斥写了个 2 n 2^n 2n,因为当时猜测 n n n 不会很大,然后就被卡掉了,又 Y Y YY YY 了一个欧拉函数的写法。

我老记得我在 c f cf cf 上面做过一个类似的题目,但是找了好久也没找到。

这个题 也差不多,但是没那味了。

考虑容斥。

求出 m m m 的所有约数 f a c [ i ] fac[i] fac[i],对于某一个 a [ j ] a[j] a[j] ,如果 f a c [ i ]   m o d   a [ j ] = = 0 fac[i] \ mod \ a[j]==0 fac[i] mod a[j]==0,那么记 c n t [ i ] = 1 cnt[i]=1 cnt[i]=1

我们在求 f a c [ i ] fac[i] fac[i] 在环上的贡献的时候,实际上是 f a c [ i ] fac[i] fac[i] 的倍数的 f a c [ j ] fac[j] fac[j] 位置的有 c n t [ i ] cnt[i] cnt[i] 的贡献被计算过。对于这些 c n t [ j ] cnt[j] cnt[j],我们要减去 c n t [ i ] cnt[i] cnt[i]
所以对于 a [ i ] a[i] a[i] 的倍数中的 f a c [ j ] fac[j] fac[j] 我们一开始要令 c n t [ j ] = 1 cnt[j]=1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值