基础数论函数练习题

先考虑怎么求lcm,考虑从序列后部插入一个数(y)的影响。
(frac{xy}{(x,y)}=xfrac{y}{(x,y)})
(x)是容易计算的,边算边取模即可。
(frac{y}{(x,y)})这个东西很难计算,因为(x)很大。
但是((x,y)=(xmod y,y)),所以可以从左到右计算之前所有数乘起来模(y)的值。
一次时间复杂度(O(n^2log_2n))
注意到我们插入后,答案肯定是原来的倍数。
考虑固定右端点(l),从左向右插入,令(b_i)表示插入(i)后原答案乘以的值。
(b_{l...r})的乘积就是区间([l,r])的答案,这样子可以快速计算以某个数为左端点的答案。
(b_i=frac{a_i}{(a_i,x)}),而(x)就是(b_{l...r-1})的乘积
(c_i=frac{a_i}{b_i}),这实际上就是(gcd(a_{l...r-1}))(c_{i+1}=(a_i,x))
暴力计算时间复杂度(O(n^2log_2V))
由于经典结论,((a_i,x))从左到右最多只有(log_2V)个,使用整除即可判定gcd是否会变化,最多只会变化(log_2V)次。
时间复杂度优化到(O(n^2+nlog_2^2V))

原文地址:https://www.cnblogs.com/ctmlpfs/p/14543766.html