洛谷P5071 此时此刻的光辉

2s512M。
解:先分解质因数。考虑按照质因数大小是否大于√分类。
大于的就是一个数颜色个数,莫队即可n√m。
小于的直接枚举质因数做前缀和然后O(1)查询。总时间复杂度n(√m + σ(√V))。
发现我们T飞了,发现莫队的复杂度较优,而处理小于√V的质因数较劣。我们平衡一下。
把界调整到1000。这样比lm大的至多两个,莫队常数*2。而后半部分的复杂度就变成了nσ(3√V),可以通过本题。
#include <bits/stdc++.h>
const int N = , MO = ;
inline char gc() {
static char *p1, *p2, s[N];
if(p1 == p2) p2 = (p1 = s) + fread(s, , N, stdin);
return (p1 == p2) ? EOF : *p1++;
}
template <class T> inline void read(T &x) {
x = ;
register char c(gc());
while(c < '' || c > '') {
c = gc();
}
while(c >= '' && c <= '') {
x = x * + c - ;
c = gc();
}
return;
}
int ex[N], p[N], a[N], lc[N], rc[N], fr[N], top, X[N * ], xx, inv[N], bin[N], Ans, ans[N], sum[N], exx[N];
bool vis[N];
std::vector<int> v[N], v2[N];
struct Node {
int l, r, id;
inline bool operator < (const Node &w) const {
if(fr[l] != fr[w.l]) return l < w.l;
return r < w.r;
}
}node[N];
inline void getp(int n) {
for(register int i = ; i <= n; i++) {
if(!vis[i]) p[++top] = i;
for(int j = ; j <= top && i * p[j] <= n; j++) {
vis[i * p[j]] = ;
if(i % p[j] == ) break;
}
}
return;
}
inline void add(int y) {
if(ex[y]) {
int x(ex[y]);
if(bin[x]) {
Ans = 1ll * Ans * inv[bin[x] + ] % MO;
}
++bin[x];
Ans = 1ll * Ans * (bin[x] + ) % MO;
}
if(exx[y]) {
int x(exx[y]);
if(bin[x]) {
Ans = 1ll * Ans * inv[bin[x] + ] % MO;
}
++bin[x];
Ans = 1ll * Ans * (bin[x] + ) % MO;
}
return;
}
inline void del(int y) {
if(ex[y]) {
int x(ex[y]);
Ans = 1ll * Ans * inv[bin[x] + ] % MO;
--bin[x];
if(bin[x]) {
Ans = 1ll * Ans * (bin[x] + ) % MO;
}
}
if(exx[y]) {
int x(exx[y]);
Ans = 1ll * Ans * inv[bin[x] + ] % MO;
--bin[x];
if(bin[x]) {
Ans = 1ll * Ans * (bin[x] + ) % MO;
}
}
return;
}
inline void solve(int x) {
printf("div : %d \n", x);
for(int i = ; i <= top; i++) {
if(x % p[i]) continue;
while(x % p[i] == ) {
printf("%d ", p[i]);
x /= p[i];
}
}
if(x > ) printf("%d ", x);
puts("");
return;
}
int main() {
getp();
register int n, m, lm();
//scanf("%d%d", &n, &m);
read(n), read(m);
int T = n / sqrt(m);
for(register int i(); i <= n; ++i) {
//scanf("%d", &a[i]);
read(a[i]);
fr[i] = (i - ) / T + ;
register int x(a[i]), j();
for(; p[j] <= lm && p[j] <= x; ++j) {
register int cnt();
while(x % p[j] == ) {
x /= p[j];
++cnt;
}
if(cnt) {
v[j].push_back(i);
v2[j].push_back(cnt);
}
}
if(x == ) continue;
for(; j <= top; j++) {
if(x % p[j] == ) {
exx[i] = p[j];
X[++xx] = p[j];
x /= p[j];
break;
}
}
if(x > ) {
ex[i] = x;
X[++xx] = x;
}
}
std::sort(X + , X + xx + );
xx = std::unique(X + , X + xx + ) - X - ;
for(register int i(); i <= n; ++i) {
//printf("i = %d : %d %d \n", i, ex[i], exx[i]);
if(ex[i]) {
ex[i] = std::lower_bound(X + , X + xx + , ex[i]) - X;
}
if(exx[i]) {
exx[i] = std::lower_bound(X + , X + xx + , exx[i]) - X;
}
}
for(register int i(); i <= m; ++i) {
//scanf("%d%d", &node[i].l, &node[i].r);
read(node[i].l); read(node[i].r);
node[i].id = i;
}
inv[] = inv[] = ;
for(register int i(); i <= n + ; ++i) {
inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
}
for(register int i(); i <= fr[n]; ++i) {
lc[i] = rc[i - ] + ;
rc[i] = lc[i] + T - ;
if(i == fr[n]) rc[i] = n;
}
std::sort(node + , node + m + );
Ans = ;
add();
int l = , r = ;
for(register int i = ; i <= m; i++) {
while(r < node[i].r) {
add(++r);
}
while(node[i].l < l) {
add(--l);
}
while(node[i].r < r) {
del(r--);
}
while(l < node[i].l) {
del(l++);
}
ans[node[i].id] = Ans;
//printf("ans %d = %d \n", node[i].id, Ans);
}
/// step 2
for(register int i(); p[i] <= lm; ++i) {
int LEN(v[i].size()), p();
for(register int j(); j <= n; ++j) {
sum[j] = sum[j - ];
if(p < LEN && v[i][p] == j) {
sum[j] += v2[i][p++];
}
}
for(register int j(); j <= m; ++j) {
int x = sum[node[j].r] - sum[node[j].l - ];
ans[node[j].id] = 1ll * ans[node[j].id] * (x + ) % MO;
}
}
for(register int i(); i <= m; ++i) {
printf("%d\n", ans[i]);
}
return ;
}
AC代码
洛谷P5071 此时此刻的光辉的更多相关文章
- 洛谷 P5071 - [Ynoi2015] 此时此刻的光辉(莫队)
洛谷题面传送门 一道其实算得上常规的题,写这篇题解是为了总结一些数论中轻微(?)优化复杂度的技巧. 首先感性理解可以发现该问题强于区间数颜色问题,无法用常用的 log 数据结构维护,因此考虑分块/莫队 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
- 洛谷八月月赛Round1凄惨记
个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...
随机推荐
- 如何使用Spark大规模并行构建索引
使用Spark构建索引非常简单,因为spark提供了更高级的抽象rdd分布式弹性数据集,相比以前的使用Hadoop的MapReduce来构建大规模索引,Spark具有更灵活的api操作,性能更高,语法 ...
- swagger请求参数在header中添加token
网友大部分说的是如下配置 参照配置然而没有作用 注掉改红框内的配置,在方法上加如下注释就可以用 @ApiImplicitParams({ @ApiImplicitParam(paramType = & ...
- drupal-note2 drush运行make文件
进入durpal项目的根目录中执行 drush make build-openpublic.make /path/to/webroot 参考: Managing Drush make files fo ...
- Loadrunner安装与破解【转】
Loadrunner安装与破解 一.下载 我的LoadRunner 11下载地址是: http://pan.baidu.com/s/1qYFy2DI 二.安装 1.启动安装程序 运行setup.exe ...
- 解决Mybatis的invalid bound statement (not found)异常
使用Maven构建SSM时, 需要在pom.xml中配置一些信息, 否则mapper.xml就无法被扫描到, 程序就会抛invalid bound statement (not found)异常 解决 ...
- 动态设置背景图片,class,style
1.动态设置背景图片<div v-if='img ' :style="{background: 'url('+ img +')',backgroundSize:cover }" ...
- UNION操作用于合并两个或多个 SELECT 语句的结果集。
UNION操作用于合并两个或多个 SELECT 语句的结果集. 大理石平台价格 使用示例: $Model->field('name') ->table('think_user_0') -& ...
- 「题解」:[AHOI2013]作业
问题: 作业 时间限制: 10 Sec 内存限制: 512 MB 题面 题目描述 此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是 ...
- 报错C1189 #error: "No Target Architecture"
根本原因: 是因为单独包含了一些windows.h已经包含了的头文件如"fileapi.h","WinUser.h",但是却没有包含windows.h 或者先包 ...
- Elasticsearch template学习
Elasticsearch template Elasticsearch存在一个关键问题就是索引的设置及字段的属性指定,最常见的问题就是,某个字段我们并不希望ES对其进行分词,但如果使用自动模板创建索 ...