cf

题目大意:有个一开始为空的序列。每次操作会往序列最后加一个 1 1 1 m m m 的随机整数。当整个序列的 gcd ⁡ \gcd gcd 1 1 1 时停止。问这个序列的期望长度对 1 0 9 + 7 10^9+7 109+7 取模的值。

1.对于 50 % 50\% 50% 的数据 : 1 ≤ m ≤ 1000 1≤m≤1000 1m1000

f [ i ] f[i] f[i] 表示当前的 g c d gcd gcd i i i (第一个位置的数为 i i i 开始),到序列所有的 g c d gcd gcd 1 1 1 的状态的期望步数,初值 f [ 1 ] = 0 f[1] = 0 f[1]=0,那么它的转移方程就是:

f [ i ] = 1 m ∗ ∑ j = 1 m ( f [ gcd ⁡ ( i , j ) ] + 1 ) = 1 + 1 m ∗ ∑ j = 1 m f [ gcd ⁡ ( i , j ) ] f[i]=\dfrac{1}{m}*\sum\limits^m_{j=1}{(f[{\gcd(i,j)}]+1)} =1 +\dfrac{1}{m}*\sum\limits^m_{j=1}f[{\gcd(i,j)}] f[i]=m1j=1m(f[gcd(i,j)]+1)=1+m1j=1mf[gcd(i,j)]

然后我们把 i = = gcd ⁡ ( i , j ) i==\gcd(i,j) i==gcd(i,j) 这种提出来:

得到: f [ i ] = 1 + 1 m ∗ ∑ j = 1 , i ∤ j m f [ gcd ⁡ ( i , j ) ] + 1 m ∗ f [ i ] ∗ ⌊ m i ⌋ f[i] = 1+\dfrac{1}{m}*\sum\limits^m_{j=1,i\nmid j}f[{\gcd(i,j)}] +\dfrac{1}{m}* f[i]*\lfloor\frac{m}{i}\rfloor f[i]=1+m1j=1,ijmf[gcd(i,j)]+m1f[i]im

然后移项得: f [ i ] = 1 + 1 m ∗ ∑ j = 1 , i ∤ j m f [ gcd ⁡ ( i , j ) ] 1 − ⌊ m i ⌋ ∗ 1 m f[i]=\dfrac{1+\dfrac{1}{m}*\sum\limits^m_{j=1,i\nmid j}f[{\gcd(i,j)}]}{1-\lfloor\frac{m}{i}\rfloor*\dfrac{1}{m}} f[i]=1imm11+m1j=1,ijmf[gcd(i,j)]

然后求出 f [ 1 − m ] f[1-m] f[1m] ,第一步每个情况都有 1 m \dfrac{1}{m} m1 的概率走到,

所以最终答案为: a n s = ∑ i = 1 m f [ i ] m + 1 ans=\dfrac{\sum\limits^m_{i=1}f[i]}{m} + 1 ans=mi=1mf[i]+1

对于求每个 f [ i ] f[i] f[i] ,这里暴力求 ,复杂度 O ( m 2 l o g 2 m ) O(m^2log_2m) O(m2log2m)


2.对于 100 % 100\% 100% 的数据 : 1 ≤ m ≤ 100000 1≤m≤100000 1m100000

考虑快速求出 gcd ⁡ \gcd gcd ,我们套路地枚举 gcd ⁡ \gcd gcd,设 g ( i , j ) g(i,j) g(i,j) 表示有多少个 1 ≤ x ≤ m 1\le x\le m 1xm 满足 gcd ⁡ ( i , x ) = j \gcd(i,x)=j gcd(i,x)=j
那么就有:

f [ i ] = 1 + 1 m ∗ ∑ j ∣ i f [ j ] ∗ g ( i , j ) 1 − ⌊ m i ⌋ ∗ 1 m f[i]=\dfrac{1+\dfrac{1}{m}*\sum\limits_{j|i}f[j]*g(i,j)}{1-\lfloor\frac{m}{i}\rfloor*\dfrac{1}{m}} f[i]=1imm11+m1jif[j]g(i,j)

然后考虑求 g ( i , j ) ( j ∣ i ) g(i,j)(j|i) g(i,j)(ji)

g ( i , j ) = ∑ x = 1 m [ gcd ⁡ ( i , x ) = j ] g(i,j)=\sum\limits^m_{x=1}[\gcd(i,x)=j] g(i,j)=x=1m[gcd(i,x)=j]

g ( i , j ) = ∑ x = 1 ⌊ m j ⌋ [ gcd ⁡ ( i j , x ) = 1 ] g(i,j)=\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{x=1}[\gcd(\frac{i}{j},x)=1] g(i,j)=x=1jm[gcd(ji,x)=1]

因为
∑ d ∣ n u ( d ) = [ n = 1 ] \sum_{d|n}u(d)= [n=1] dnu(d)=[n=1]

这里把 n n n 换成 gcd ⁡ ( i j , x ) \gcd(\frac{i}{j},x) gcd(ji,x) 得到

g ( i , j ) = ∑ x = 1 ⌊ m j ⌋ ∑ d ∣ gcd ⁡ ( i j , x ) μ ( d ) g(i,j)=\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{x=1}\sum\limits_{d|\gcd(\frac{i}{j},x)}\mu(d) g(i,j)=x=1jmdgcd(ji,x)μ(d)

g ( i , j ) = ∑ d ∣ i j μ ( d ) ∑ d ∣ x ⌊ m j ⌋ 1 g(i,j)=\sum\limits_{d|\frac{i}{j}}\mu(d)\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{d|x}1 g(i,j)=djiμ(d)dxjm1

g ( i , j ) = ∑ d ∣ i j μ ( d ) ⌊ m j d ⌋ g(i,j)=\sum\limits_{d|\frac{i}{j}}\mu(d)\lfloor\dfrac{m}{jd}\rfloor g(i,j)=djiμ(d)jdm

然后最终就等于:

f [ i ] = 1 + 1 m ∗ ∑ j ∣ i f [ j ] ∗ ∑ d ∣ i j μ ( d ) ⌊ m j d ⌋ 1 − ⌊ m i ⌋ ∗ 1 m f[i]=\dfrac{1+\dfrac{1}{m}*\sum\limits_{j|i}f[j]*\sum\limits_{d|\frac{i}{j}}\mu(d)\lfloor\dfrac{m}{jd}\rfloor}{1-\lfloor\frac{m}{i}\rfloor*\dfrac{1}{m}} f[i]=1imm11+m1jif[j]djiμ(d)jdm

复杂度大概 O ( m ∗ m ) O(m*\sqrt{m}) O(mm )

你可能感兴趣的:(codeforce)