zoukankan      html  css  js  c++  java
  • CodeForces 1109E. Sasha and a Very Easy Test

    题目简述:给定$m leq 10^9+9$,维护以下操作

    1. "1 l r x":将序列$a[l], a[l+1], dots, a[r]$都乘上$x$。

    2. "2 p x":将$a[p]$除以$x$,保证可整除。

    3. "3 l r":求$(a[l]+a[l+1]+dots+a[r]) mod m$。

    解:code

    除了操作2以外,都显然可以用线段树维护。

    主要遇到的问题是$m$不一定是质数,不妨设$m = p_1^{m_1} p_2^{m_2} dots p_k^{m_k}$,其中$k = O(log m)$。由于$m leq 10^9+9$,则$k leq 9$。

    我们将所有数字$x$都分解成$(k+1)$个部分$x = x_0 p_1^{x_1} p_2^{x_2} dots p_k^{x_k}$,其中$gcd(x_0,m) = 1$。

    对于操作2,设$a = a_0 p_1^{a_1} p_2^{a_2} dots p_k^{a_k}$,把$a$除以$x$可以看做是两个操作:

    2.1. 将$a_0$乘以$x_0^{-1} mod m$。而求$x_0^{-1} mod m$需要Euclid辗转相除法。

    2.2. 将$a_1, dots, a_k$依次减去$x_1, dots, x_k$。

    因此,我们只需要维护$a_0, a_1, dots, a_k$即可,时间复杂度为$O((q+n) log n log m)$。

  • 相关阅读:
    网络编程[28]
    网络编程[30]
    网络编程[20]
    网络编程[29]
    网络编程[19]
    网络编程[15]
    网络编程[12]
    hdu 3802【Ipad,IPhone】
    hdu 2616【Kill the monster】
    hdu 1026【Ignatius and the Princess I】
  • 原文地址:https://www.cnblogs.com/TinyWong/p/10401535.html
Copyright © 2011-2022 走看看