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)$。

  • 相关阅读:
    第七次作业
    rfid工作原理
    实验九——基本数据类型存储及应用总结
    实验八——函数定义及调用总结
    实验七——函数定义及调用总结
    作业
    作业
    作业
    开始
    实验12——指针的基础应用2
  • 原文地址:https://www.cnblogs.com/TinyWong/p/10401535.html
Copyright © 2011-2022 走看看