A1339. JZPLCM(顾昱洲)|树状数组|hash表|逆元|分解质因数
各种细节实现
注意 树状数组 的下标不能为 0
注意 代码条理清晰
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
const int maxn=1e5+10;
const int mo=1000000007;
const int sqrn=31623;
#define LL long long
using namespace std;
int n,m;
//shai
int prime[sqrn],cnt_prime;
bool isprime[sqrn];
void shai()
{for(int i=2;i<=sqrn;i++){if(!isprime[i]) prime[++cnt_prime]=i;for(int j=1;j<=cnt_prime&&prime[j]*i<=sqrn;j++){isprime[prime[j]*i]=true;if(i%prime[j]==0)break;}}
}
//num
int num1[maxn*20],num2[maxn*20],c[maxn*20],cnt_num;
int s[maxn],t[maxn];
void chai(int x)
{for(int i=1;i<=cnt_prime;i++)if(x%prime[i]==0){int tmp=prime[i];while(x%prime[i]==0) num1[++cnt_num]=tmp,num2[cnt_num]=prime[i],tmp=tmp*prime[i],x/=prime[i];}if(x!=1) num1[++cnt_num]=x,num2[cnt_num]=x;
}
//st
int st[maxn*20],st_loc[maxn*20],st_mo=maxn*20-1;
int st_q(int x)
{int y=x%st_mo;while(st[y]!=0&&st[y]!=x) y++,y%=st_mo;return y;
}
//Q
int ans[maxn];
struct H {int l,r,id;}qq[maxn];
int tree[maxn*20];
bool cmp(H a,H b){return a.r<b.r;}
int lowbit(int x)
{return -x&x;
}
void add(int x,int y)
{x++;while(x<=cnt_num){tree[x]=(LL)tree[x]*y%mo;x+=lowbit(x);}
}
int q(int x)
{x++;int ans=1;while(x>0){ans=(LL)ans*tree[x]%mo;x-=lowbit(x);}return ans;
}
//ni
int sum[maxn*20];
int f(int x,int y)
{if(y==0) return 1;int t=f(x,y/2);t=(LL)t*t%mo;if(y&1) t=(LL)t*x%mo;return t;
}
//main
int main()
{shai();scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) {int x;scanf("%d",&x);s[i]=cnt_num+1;chai(x);t[i]=cnt_num;}for(int i=1;i<=cnt_num;i++) {int x=st_q(num1[i]);c[i]=st_loc[x];st[x]=num1[i];st_loc[x]=i;}for(int i=1;i<=m;i++) scanf("%d %d",&qq[i].l,&qq[i].r),qq[i].id=i;sort(qq+1,qq+m+1,cmp);int now=0;for(int i=1;i<=cnt_num;i++) tree[i]=1;sum[0]=1;for(int i=1;i<=cnt_num;i++) sum[i]=(LL)sum[i-1]*num2[i]%mo;for(int i=1;i<=cnt_num;i++) sum[i]=f(sum[i],mo-2);for(int i=1;i<=m;i++){int r=qq[i].r,l=qq[i].l,id=qq[i].id;while(now<r) for(int i=s[++now];i<=t[now];i++) add(c[i],num2[i]);ans[id]=(LL)q(t[l-1])*sum[t[l-1]]%mo;}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}
A1339. JZPLCM(顾昱洲)|树状数组|hash表|逆元|分解质因数相关推荐
- ACM模板——线段树树状数组ST表
int bit[maxn],n; void init() {n = maxn;memset(bit,0,sizeof(bit)); } int sum(int i) {int s = 0;while( ...
- CF869 E. The Untended Antiquity 二位树状数组+hash
题意 一个地图,然后三种操作 1.一个矩阵四周加上障碍 2.一个矩阵四周的障碍消除 3.问你两个点之间是否纯在一条路径不经过障碍 题解 我们可以给每一个矩阵一个hash值 然后将矩阵里面的点都 ...
- codeforces869EThe Untended Antiquity(二维树状数组)
/* 二维树状数组+Hash 题意: 给一个地图(n,m) 三种操作: 1,在以(r1,c1).(r2,c2)为对角的矩形四条边上添加障碍 2,消除以(r1,c1).(r2,c2)为对角的矩形四条边上 ...
- 树状数组(求逆序对)
一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...
- 差分+树状数组 线段树【P2357】 守墓人
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...
- 洛谷 P5057 [CQOI2006]简单题(树状数组)
嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...
- Color the ball(HDU1556)树状数组
每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- poj_3067 树状数组
题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...
最新文章
- js 自带的三种弹框
- 果蝇大脑研究能够改进计算机相似性搜索算法
- Win7 64位系统 注册 ocx控件
- 黄仁勋把自己做成了虚拟娃娃
- oracle locked time,Oracle里面的用户smsdb无法登录 LOCKED(TIMED)
- 【学习笔记】利用Excel实现简易版大屏
- pandas,apply并行计算的一个demo
- OpenHub框架–下一个有趣的功能
- VMWare笔记-解决虚拟机能ping通主机能上网,但主机ping不通虚拟机(含思路)
- pytorch使用GPU训练模型
- mysql二级缓存redis_redis实现二级缓存
- python查找并修改文件中的内容_如何使用Python搜索和替换文件中的文本?
- ram_flash驱动
- Eclipse 快捷键的使用
- 逻辑运算 神经网络_使用神经网络实现逻辑门(第2部分)
- 【笔记】Python算法教程(1)
- linux nginx环境下,网站不显示字体和图形.(图形变成了方框),解决nginx下加载eot|otf|ttf|woff|svg等404 错误问题
- java 解析yml文件
- javaweb调用qq认证登录接口
- 优雅地乱玩Linux-1-系统