CF594D题解
我不会数据结构/kk
我想题意应该十分清楚了。
我们知道 \(\varphi(p^k)=p^{k-1}(p-1)\),那么我们考虑将一个询问下放到右端点,然后往右移动右端点并更新每个左端点到右端点的答案。
这就变得很容易了。最开始所有位置的答案都是 \(1\)。
加入一个数 \(a\) 的时候,因为积性函数可以拆成质数幂处的积性函数之积,所以我们这里也考虑拆成质数幂。
然后记录每一个质因子上一次出现的位置,假设为 \(x\),现在的右端点为 \(i\),那么我们令 \((x,i]\) 乘上 \(p-1\),\([1,x]\) 乘上 \(p\),剩下的位置乘上 \(p^{k-1}\)。
可以知道复杂度是 \(O(n\log n\frac {\log V}{\log\log V})\) 的。这个复杂度不知道是在哪儿看到的,反正 1e6 以内绝对不会超过 7。
这个拿线段树做就好了。
然后我们发现是单点查询,所以对标记可持久化。然后使用 zkw 线段树加上快读你就可以拿到 lg 最优解。
甚至能在 CF 上面卡进第一页。。。
实际上还有更为厉害的方法。。。
考虑每个位置的初始值都是 \(a_i\),每次往右扫时将 \(p\) 变为 \(p-1\),线段树的操作次数是我的三分之一。。。
而且这个玩意儿是可以使用树状数组的。。。
不管怎样先把我的代码挂在这里了:
#include<iostream>
#include<cctype>
#include<vector>
typedef unsigned ui;
const ui M=2e5+5,mod=1e9+7;
ui n,m,G,a[M],l[M],r[M],ans[M],prod[M<<2];ui top,pri[M*5],pos[M*5],lst[M*5];std::vector<ui>id[M];
char _input[1<<25|1],_output[1<<25|1],*_p1=_input,*_p2=_output;
inline ui read(){
ui n(0);char s;while(!isdigit(s=*_p1++));while(n=n*10+(s&15),isdigit(s=*_p1++));return n;
}
inline void write(ui&n){
static char s[10];ui top(0);while(s[++top]=n%10^48,n/=10);while(*_p2++=s[top],--top);
}
inline void sieve(const ui&M){
ui i,j,x;
for(i=2;i<=M;++i){
if(!pos[i])pri[pos[i]=++top]=i;
for(j=1;j<=pos[i]&&(x=i*pri[j])<=M;++j)pos[x]=j;
}
}
void Modify(ui l,ui r,const ui&V){
for(l+=G-1,r+=G+1;l^r^1;l>>=1,r>>=1){
if(~l&1)prod[l^1]=1ull*prod[l^1]*V%mod;
if(r&1)prod[r^1]=1ull*prod[r^1]*V%mod;
}
}
inline ui Query(ui x){
ui ans(1);x+=G;while(x)ans=1ull*ans*prod[x]%mod,x>>=1;return ans;
}
signed main(){
std::cin.read(_input,sizeof _input);
ui i,x(0),y,t;n=read();for(G=1;G<=n+1;G<<=1);for(i=1;i<=n+G;++i)prod[i]=1;
for(i=1;i<=n;++i)(a[i]=read())>x&&(x=a[i]);Build(1);sieve(x);m=read();
for(i=1;i<=m;++i)l[i]=read(),r[i]=read(),id[r[i]].push_back(i);
for(i=1;i<=n;++i){
for(x=a[i];x^1;){
if(pos[x]^1)Modify(lst[pos[x]]+1,i,pri[pos[x]]-1);if(lst[pos[x]])Modify(1,lst[pos[x]],pri[pos[x]]);
lst[y=pos[x]]=i;t=1;while(pos[x/pri[y]]==pos[x])t*=pri[y],x/=pri[y];x/=pri[y];if(t^1)Modify(1,i,t);
}
for(ui&ID:id[i])ans[ID]=Query(l[ID]);
}
for(i=1;i<=m;++i)write(ans[i]),*_p2++=10;std::cout.write(_output,_p2-_output);
}
CF594D题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- imagenamed和imageWithContentOfFile的区别
@implementation ViewController /** 图片的两种加载方式: 1> imageNamed: a. 就算指向它的指针被销毁,该资源也不会被从内存中干掉 b. 放到As ...
- Junit4进行参数化测试
@RunWith, 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner)来运行测试,而不是JUnit默认的运行器. 要进行参数化测 ...
- NSTimer、CADisplayLink、GCD 三种定时器的用法 —— 昉
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 在iOS中有很多方法完成定时器的任务,例如 NSTimer.CADisp ...
- shell脚本之数组基本操作及排序
数组的基本操作及排序 1.数组定义方法: ( 6 7 9 4 3 2) 0 1 2 3 4 5 #下标号 方法一: 数组名=(value0 value1 value2 -) 方法二: 数组名=([0] ...
- Spark算子 - aggregateByKey
释义 aggregateByKey逻辑类似 aggregate,但 aggregateByKey针对的是PairRDD,即键值对 RDD,所以返回结果也是 PairRDD,结果形式为:(各个Key, ...
- 读源码【读mybatis的源码的思路】
✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量 ...
- 学习Spring5必知必会(1)~未使用spring前的麻烦
一.未使用spring前的麻烦 开闭原则:扩展是开放的,但是对于修改是"封闭的". 1.代码耦合度比较高[不符合开闭原则]: public class EmployeeServic ...
- Jenkins项目迁移JOB
Jenkins项目迁移JOB:从旧的迁移到新的Jenkins上 北京介绍 今天由于迁移Jenkins服务器,需要完全拷贝Jenkins里的Job. 经实验,直接在服务器上移动Jobs目录下的文件即可. ...
- java POI 导出到word文档 (附工具类)
1,导入poi相关依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-o ...
- [题解]Codeforces Round #519 - C. Smallest Word
[题目] C. Smallest Word [描述] IA有一个由若干个'a'和'b'组成的字符串,IA可以翻转该字符串的任意长的前缀,IA想通过这样的操作得到一个字典序最小的字符串,求一种可能的翻转 ...