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 & ...
随机推荐
- 关于Java的=赋值操作和方法传递对象时的引用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11405920.html 下面通过一段代码和debug结果来展示Java中=操作的赋值改变过程. ...
- feiQ发送信息
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...
- 有手就行3——持续集成环境—maven、tomcat、安装和配置
有手就行3--持续集成环境-maven.tomcat.安装 持续集成环境(5)-Maven安装和配置 持续集成环境(6)-Tomcat安装和配置 持续集成环境(5)-Maven安装和配置 在Jenki ...
- 基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U VPX接口卡
一.板卡概述 标准VPX 3U板卡, 基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64b ...
- Solution -「CTSC 2018」「洛谷 P4602」混合果汁
\(\mathcal{Description}\) Link. \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ...
- fork_join
在systemverilog中可以用fork-- join.fork --join_any.fork--join_none来实现多个线程的并发执行. 1.父线程.子线程 调用fork--join的线程 ...
- corn定时任务
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year (2)Seconds Minutes Hours DayofMonth Month ...
- Vue 源码解读(7)—— Hook Event
前言 Hook Event(钩子事件)相信很多 Vue 开发者都没有使用过,甚至没听过,毕竟 Vue 官方文档中也没有提及. Vue 提供了一些生命周期钩子函数,供开发者在特定的逻辑点添加额外的处理逻 ...
- 答疑记录:jmeter从返回的html中提取指定内容
返回的html(截取部分),要求从中提取:2022-02-22 13:46:15 <!-- 前面省略557行 --> <td>2022-02-22</td> < ...
- c# 编程学习(四)
逻辑AND(逻辑与)操作符(用&&表示)和逻辑OR(逻辑或) 操作符(用||表示).这两个操作符统称条件逻辑操作符.只有作为操作数的两个布尔表达式都为 true.操作符&&am ...