洛谷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的太幸运然而因同学 ...
 
随机推荐
- SpringBoot集成JPA根据实体类自动生成表
			
数据库是mysql,在application.properties中的写法如下: 原来配置这样的时候确实可以生产表的 #spring.jpa.hibernate.ddl-auto=update 多方查 ...
 - 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法
			
title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...
 - (转)Windows中杀死占用某个端口的进程
			
启动tomcat时候,控制台报错,发现是端口占用,于是寻找方法关闭对应的程序. 从网上找了好久,尝试之后,发现不行.开始自己尝试,终于,成功的将占用端口的进程杀掉.在此记录下过程(以8081端口为例) ...
 - CNN网络中的不变性理解
			
神经网络中的不变性 原文:https://blog.csdn.net/voxel_grid/article/details/79275637 个人认为cnn中conv层对应的是“等变性”(Eq ...
 - React在componentWillMount中请求接口数据结束后再执行render
			
1.在getInitialState中初始化isloading,初始值false getInitialState() { return { editionid: '', isloading:false ...
 - Sky Code
			
Sky Code 给出n个数,求选出4个数组合,使其gcd为1,,\(n<=10000\),每个数\(<=10000\). 解 理解1:容斥原理 注意到Mobius反演式子不好写出,于是我 ...
 - 杂项-VOD:VOD(视频点播)
			
ylbtech-杂项-VOD:VOD(视频点播) 视频点播是二十世纪90年代在国外发展起来的,英文称为“Video on Demand”,所以也称为“VOD”.顾名思义,就是根据观众的要求播放节目的视 ...
 - PKU--3211 Washing Clothes(01背包)
			
题目http://poj.org/problem?id=3211 分析:两个人洗衣服,可以同时洗,但是只能同时洗一种颜色. 要时间最短,那么每一种颜色的清洗时间最短. 转换为,两个人洗同一种颜色的衣服 ...
 - TKmybatis的框架介绍及使用方法
			
最近项目使用了SpringBoot+TKMytis框架,期间遇到一些问题,顺便记一下. 一.框架配置 配置的话非常简单,我用的是SpringBoot,直接引入: <dependency> ...
 - 小程序 设置tabBar选中颜色和图标
			
"tabBar": { "selectedColor": "#4da9ff", //颜色 "list": [{ &quo ...