zoukankan      html  css  js  c++  java
  • 基础数论函数练习题

    先考虑怎么求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))

  • 相关阅读:
    (一)单例模式
    mysql数据库知识
    JavaScript
    Spring整合AspectJ的AOP
    Spring-AOP
    JDK代理和CGLIB代理
    mybatis-dao开发
    mybatis-入门
    CSS2.1
    HTML基础
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/14543766.html
Copyright © 2011-2022 走看看