题面:
题意:
有一个长度为 m m m 的环,编号为 [ 0 , m − 1 ] [0,m-1] [0,m−1],有 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