链接:E.简单数据结构1

题意:

给一个长为n的序列,m次操作,每次操作:
1.区间
2.对于区间,查询 ,一直到-
请注意每次的模数不同。
 
题解:扩展欧拉定理降幂

对一个数p取log(p)次的欧拉函数等于1,故可将操作2的复杂度降到log(p),可以直接求解。用树状数组的小技巧,可以在log的时间直接求出当前的a[i]。具体见代码。

#include <bits/stdc++.h>
using namespace std; const double EPS = 1e-;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
const int maxn = 5e5 + ;
const int maxm = 2e7 + ;
int n, m;
long long a[maxn], bit[maxn];
int phi[maxm]; void Eul_list(int n) //欧拉函数_list
{
memset(phi, , sizeof(phi));
phi[] = ; for(int i = ; i < n; i++){
if(!phi[i]){
for(int j = i; j < n; j += i){
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - );
}
}
}
} void add(int i, long long d)
{
while(i < maxn){
bit[i] += d;
i += -i & i;
}
} long long sum(int i)
{
long long ans = ;
while(i){
ans += bit[i];
i -= -i & i;
}
return ans;
} long long Mod(long long x, long long y) //欧拉定理的条件
{
return x < y ? x : x % y + y;
} long long pow_mod(long long x, long long n, long long mod)
{
long long ans = ;
x = Mod(x, mod);
while(n){
if(n & ) ans = Mod(ans * x, mod);
x = Mod(x * x, mod);
n >>= ;
}
return ans;
} long long dfs(int l, int r, int p)
{
long long val = sum(l);
if(l == r || p == ) return Mod(val, p); //降幂加速
return pow_mod(val, dfs(l + , r, phi[p]), p);
} int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%lld", &a[i]);
add(i, a[i] - a[i-]); //对i求前缀和及为a[i]
} Eul_list(maxm); int op, l, r, x;
while(m--){
scanf("%d%d%d%d", &op, &l, &r, &x);
if(op == ){
//只需要当前数时的更新技巧
add(l, x);
add(r + , -x);
}
else printf("%lld\n", dfs(l, r, x) % x);
} return ;
}

牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)的更多相关文章

  1. 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)

    https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iost ...

  2. 牛客网多校第5场 H subseq 【树状数组+离散化】

    题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...

  3. 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】

    题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...

  4. 牛客练习赛22 C 简单瞎搞题

    //位运算 // & 都是1 才是 1 // | 都是0 才是0 // ^ 不一样才是1 #include <iostream> #include <cstdio> # ...

  5. BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组

    BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...

  6. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  7. 牛客练习赛22 简单瞎搞题(bitset优化dp)

    一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 输入描述: 第一行一个数 n. 然后 n 行,每行两个数表示 li,ri.   输出 ...

  8. 牛客练习赛43-F(简单容斥)

    题目链接:https://ac.nowcoder.com/acm/contest/548/F 题意:简化题意之后就是求[1,n]中不能被[2,m]中的数整除的数的个数. 思路:简单容斥题,求[1,n] ...

  9. 【牛客练习赛22 C】

    https://www.nowcoder.com/acm/contest/132/C 题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果. 题目分析:对于这种挑选数字相加,由于每一步不同的 ...

随机推荐

  1. 快餐店之间插入仓库,路最短,DP,POJ(1485)

    题目链接:http://poj.org/problem?id=1485 暂时我还没想出思路求路径.哈哈哈,先写一下中间步骤吧. #include <stdio.h> #include &l ...

  2. C++STL之multiset多重集合容器

    multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明 ...

  3. VedioCapture

    国内的技术的浮躁可见一般,在一个用了七八年的项目里面使用的类,居然拼写都是错的,在网上一搜,转载的也大有人在,最低级的错误,你可以不懂编程,但是只要上过高中,Video这个单词总该学过吧,居然转载的时 ...

  4. java设计模式——桥接模式

    一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...

  5. element el-tooltip 内容换行的方法

    <el-tooltip class="item" effect="light" placement="top-start">  ...

  6. Linux问题分析或解决_ssh无法连接

    1. ldd - 检查依赖库是否存在问题 问题:ssh连接不上,之前一直没有问题,最近别人安装了其他桌面(系统Ubuntu) 解决: 查看进程,发现没有启动 ps -ef | grep ssh 重新安 ...

  7. thinkphp 跳转外网代码(php通用)

    thinkphp 提供了一个重定向但是在跳转外部网站的时候就会比较麻烦 下面一种方法还不错, < ?php //重定向浏览器 header("Location: http://www. ...

  8. System.gc()日志分析

    打开日志:运行配置---XX:+PrintGCDetails 示例程序: package com.test; public class Test { private Object instance = ...

  9. RabbitMQ (1) 环境安装

    1.下载erlang, 设置系统的环境变量 下载地址:http://www.erlang.org/downloads ERLANG_HOME=D:\Program\erl9.3 Path = %ERL ...

  10. Python基础-字符串的使用

    基础知识 字符串解释:字符串是不可变的,所有元素赋值和切片赋值操作都是非法的,属于序列一种(字符串.元组.列表). 一.格式化字符串 (1).format()方法==str.format() 作用:将 ...