题目描述

输入

输出

有M行,每个询问一行,输出结果mod 1,000,000,007的值。

样例输入

10 3

3 5 1 2 3 1 3 5 2 1

7 9

3 9

2 3

样例输出

10

19

6

数据范围

对于30%的数据,N,M<=1000

对于50%的数据,N,M<=30000

对于100%的数据,N,M<=100000

解法

离线不修改区间询问,考虑莫队算法。

利用线性筛法预处理出所有要用的逆元后。

显然每次容易O(1)处理。

总的时间复杂度为O(n1.5)。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define sqr(x) ((x)*(x))
#define ln(x,y) ll(log(x)/log(y))
using namespace std;
const char* fin="ex3568.in";
const char* fout="ex3568.out";
const ll inf=0x7fffffff;
const ll maxn=100007,mo=1000000007;
ll n,m,i,j,k,ks,l,r,tmp;
ll a[maxn],ans[maxn],tong[maxn],tx[maxn];
ll ny[maxn];
struct qu{
ll l,r,lk,id;
}b[maxn];
bool cmp(qu a,qu b){
return a.lk<b.lk || a.lk==b.lk && a.r<b.r;
}
ll qpower(ll a,ll b){
ll c=1;
while (b){
if (b&1) c=c*a%mo;
a=a*a%mo;
b>>=1;
}
return c;
}
void add(ll v){
tmp=(tmp+mo-tx[a[v]])%mo;
if (tong[a[v]]==0) tx[a[v]]=1;
tong[a[v]]++;
tx[a[v]]=(tx[a[v]]*a[v])%mo;
tmp=(tmp+tx[a[v]])%mo;
}
void del(ll v){
tmp=(tmp+mo-tx[a[v]])%mo;
tong[a[v]]--;
tx[a[v]]=(tx[a[v]]*ny[a[v]])%mo;
if (tong[a[v]]==0) tx[a[v]]=0;
tmp=(tmp+tx[a[v]])%mo;
}
int main(){
scanf("%d%d",&n,&m);
ks=(ll)(sqrt(n));
for (i=1;i<=n;i++) scanf("%d",&a[i]);
for (i=1;i<=100000;i++) ny[i]=qpower(i,mo-2);
for (i=1;i<=m;i++){
scanf("%d%d",&b[i].l,&b[i].r);
b[i].lk=(b[i].l-1)/ks+1;
b[i].id=i;
}
sort(b+1,b+m+1,cmp);
l=1;
r=0;
tmp=0;
for (i=1;i<=m;i++){
while (r<b[i].r) add(++r);
while (l>b[i].l) add(--l);
while (l<b[i].l) del(l++);
while (r>b[i].r) del(r--);
ans[b[i].id]=tmp;
}
for (i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}

启发

涉及到预处理素数取模时的逆元,可由这道题对线筛的分析得到预处理逆元的可能性。


莫队的单次扩展一定要保证O(1)的时间。

【时光回溯】【JZOJ3568】【GDKOI2014】小纪的作业题的更多相关文章

  1. 【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划

    题目描述 输入 输出 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. 样例输入 2 3 6 1 5 1 2 1 2 3 2 5 4 5 4 3 2 1 3 1 1 ...

  2. 【时光回溯】【JZOJ3566】【GDKOI2014】阶乘

    题目描述 输入 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和base. 输出 对于每组数据,输出一个十进制整数,表示在base进制下,n!结尾的零的个数. 样例 ...

  3. 【时光回溯】【JZOJ3571】【GDKOI2014】内存分配

    题目描述 输入 输出 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位数. 样例输入 2 3 1 4 1 4 2 2 1 2 1 1 1 1 1 样例输出 2 3 1 数据范围 ...

  4. zzulioj - 2623: 小H的作业题

    题目链接:http://acm.zzuli.edu.cn/problem.php?id=2623 题目描述        期末考试即将来临,同学们都积极的在图书馆复习.今天小H也来到图书馆复习,小H掏 ...

  5. java lambda小纪

    一个通俗的说法是 :C#委托和Java中实现了 函数式编程的方法,它是函数式编程中的概念,为了更快的处理集合,在Java,c#等静态类型语言中想要引用一个函数的一种方式,(实现了通过封装匿名方法来达到 ...

  6. TCP/IP小纪

    链 路 层 主 要 有 三 个 目 的 :( 1 )为 I P 模 块 发 送 和 接收 I P 数 据 报 ; ( 2 )为 A R P 模块发送 A R P 请 求 和 接 收 A R P 应 答 ...

  7. Python学习小纪

    1.打包发布*.py文件---"文件路径下打开命令行 d:\python\python.exe setup.py sdist" eg:打包发布f:\C\python\print_l ...

  8. 2017年前小纪(有关http的一些缓存理论知识)

    position的top和bottom的区别:前者基准点定在top,后者基准点定在bottom. for-in 遍历属性的顺序不确定 手机端,line-height对光标大小非常有影响 有些css3属 ...

  9. vivado/FPGA 使用小纪

    1.使用FPGA做为外部控制器的总线译码时,将总线时钟接在全局时钟脚上(MRCC),就算接在了局部时钟(SRCC)上,也要通过BUFG转为全局时钟走线,否则会因为local clk到各部分的时延较大引 ...

随机推荐

  1. 【DM642学习笔记二】dsp基础实验:发光二级管的显示 led.c

    1,OSDFPGA配置一个专用的8位寄存器控制指示灯亮灭,访问地址为90080017h,由电路图可知低电平点亮. 2,程序运行时,可直接editmemory.即修改90080017h地址的值(可在Ed ...

  2. Eureka配置问题

    在使用Spring Cloud做微服务开发中,经常会使用Eureka Server作为注册中心,如果配置不当可能会导致一些不可预期的异常信息.以下是我最近遇到的因为忽略了配置eureka.client ...

  3. JasperReport报表设计4

    在JRXML模板(或JRXML文件)中的JasperReport 都是标准的 XML文件,以.JRXML扩展.所有JRXML文件包含标签<jasperReport>,作为根元素.这反过来又 ...

  4. WebConfig配置文件

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  5. Vue-cli3.x中使用Axios发送跨域请求的配置方法

    Vue-cli3.x中使用Axios发送跨域请求的配置方法 安装axios npm i axios -s main.js中引入 import axios from 'axios' //将axios挂载 ...

  6. Clash Credenz 2014 Wild Card Round题解

    A题 简单模拟. /************************************************************************* > File Name: ...

  7. Hackerrank--Savita And Friends(最小直径生成树MDST)

    题目链接 After completing her final semester, Savita is back home. She is excited to meet all her friend ...

  8. 中断描述符表 IDT

    保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...

  9. 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型

    一.概述: 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis ...

  10. Python 爬取高清桌面壁纸

    今天写了一个脚本用来爬取ZOL桌面壁纸网站的高清图片: 链接:http://desk.zol.com.cn/1920x1080/ 本程序只爬了美女板块的图片,若要下载其他板块,只需修改程序中的&quo ...