LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

前置知识:闭区间上的连续函数的零点存在性定理:

我们定义这样的函数:

定义域为 [ l , r ] ∩ Z [l,r]\cap \mathbb Z [l,r]∩Z 对于 ∀ x ∈ [ l , r − 1 ] ∩ Z \forall x \in [l,r-1]\cap \mathbb Z ∀x∈[l,r−1]∩Z,有 ∣ f ( x + 1 ) − f ( x ) ∣ ≤ 1 |f(x+1)-f(x)|\le 1 ∣f(x+1)−f(x)∣≤1,则称它为定义在闭区间 [ l , r ] [l,r] [l,r] 上的整数连续函数。(我自己瞎定义的)。那么在这上面,零点存在性定理仍适用。

而 μ \mu μ 的前缀和函数显然是这样的函数,于是可以使用这个定理,直接二分即可。

那么关键在于要求 [ 1 , N ] [1,N] [1,N] 范围内 M ( n ) = ∑ i = 1 n μ ( i ) M(n)=\sum_{i=1}^n\mu(i) M(n)=∑i=1n​μ(i) 的最值。其中 N = 1 0 5 , 1 0 7 , 1 0 9 N=10^5,10^7,10^9 N=105,107,109。

对于 N = 1 0 5 , 1 0 7 N=10^5,10^7 N=105,107 的点,直接写个线性筛 μ \mu μ,再线性扫一遍即可。可以求得:

当 N = 1 0 5 N=10^5 N=105 时,最大值点 n 1 = 48433 n_1=48433 n1​=48433,最小值点 n 2 = 96014 n_2=96014 n2​=96014;

当 N = 1 0 7 N=10^7 N=107 时,最大值点 n 1 = 9993034 n_1=9993034 n1​=9993034,最小值点 n 2 = 7109110 n_2=7109110 n2​=7109110。

而 N = 1 0 9 N=10^9 N=109 则比较困难,反正我家内存开不下 1 0 9 10^9 109 大小的数组)我采取的策略是分段,每次打 2 × 1 0 8 2\times 10^8 2×108 的表,用区间筛,就可以分五次搞出来。

最后得到的答案:最大值点 n 1 = 903087703 n_1=903087703 n1​=903087703,最小值点 n 2 = 456877618 n_2=456877618 n2​=456877618。

这里给出最后一次扫 ( 8 × 1 0 8 + 1 ) ∼ 1 0 9 (8\times 10^8+1)\sim 10^9 (8×108+1)∼109 时的程序:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
char In[1 << 20], *ss = In, *tt = In;
#define getchar() (ss == tt && (tt = (ss = In) + fread(In, 1, 1 << 20, stdin), ss == tt) ? EOF : *ss++)
ll read() {ll x = 0, f = 1; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');return x * f;
}
const int BAS = 8e8;
const ll PRES = 1130;
const int N = 2e8, SQN = 4e4;
int mu[N+5], lst[N+5], pr[SQN+5], ip[SQN+5], tot;
void sieve(int n) {ip[1] = 1;for(int i = 2; i <= n; i++) {if(!ip[i]) {pr[++tot] = i;}for(int j = 1; j <= tot && pr[j] <= n / i; j++) {int k = i * pr[j];ip[k] = 1;if(i % pr[j] == 0) break;}}
}
int main() {sieve(SQN);for(int i = 1; i <= N; i++)   mu[i] = 1, lst[i] = BAS + i;for(int j = 1; j <= tot; j++)for(int i = pr[j] * (BAS / pr[j] + 1); i <= BAS + N; i += pr[j]) {mu[i-BAS] *= -1; lst[i-BAS] /= pr[j];if(lst[i-BAS] % pr[j] == 0)mu[i-BAS] = 0;}for(int i = 1; i <= N; i++) if(lst[i] > 1) mu[i] *= -1;ll sum = PRES; int mx = -1, mn = -1; ll mxv = -1, mnv = -1;for(int i = 1; i <= N; i++) {sum += mu[i];if(mx == -1 || sum > mxv) mx = BAS+i, mxv = sum;if(mn == -1 || sum < mnv) mn = BAS+i, mnv = sum;}printf("mx = %d, mxv = %lld\nmn = %d, mnv = %lld\nsum=%lld\n", mx, mxv, mn, mnv, sum);return 0;
}

于是最后只需要一个写一个杜教筛即可,时间复杂度 O ( n 2 / 3 log ⁡ n ) O(n^{2/3}\log n) O(n2/3logn)。(似乎这个 log ⁡ n \log n logn 可以放到指数下面去?不懂)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
char In[1 << 20], *ss = In, *tt = In;
#define getchar() (ss == tt && (tt = (ss = In) + fread(In, 1, 1 << 20, stdin), ss == tt) ? EOF : *ss++)
ll read() {ll x = 0, f = 1; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');return x * f;
}
const int MAXN = 1e6 + 5, N = 1e6;int n, v, mu[MAXN], pr[MAXN], ip[MAXN], tot;
void sieve(int n) {ip[1] = 1; mu[1] = 1;for(int i = 2; i <= n; i++) {if(!ip[i]) {pr[++tot] = i;mu[i] = -1;}for(int j = 1; j <= tot && pr[j] <= n / i; j++) {int k = i * pr[j];ip[k] = 1;if(i % pr[j]) mu[k] = -mu[i];else {mu[k] = 0;break;}}}for(int i = 1; i <= n; i++) mu[i] += mu[i-1];
}
map<int, int> Smu;
int Calcsmu(int x) {if(x <= N) return mu[x];map<int, int>::iterator p = Smu.find(x);if(p != Smu.end()) return p->second;int ret = 1;for(int i = 2, j; i <= x; i = j + 1) {int t = x / i; j = x / t;ret -= (j - i + 1) * Calcsmu(t);}return Smu[x] = ret;
}
int main() {sieve(N);n = read(), v = read();int l, r;if(n == 100000) l = 48433, r = 96014;else if(n == 10000000) l = 7109110, r = 9993034;else l = 456877618, r = 903087703;int L = Calcsmu(l), R = Calcsmu(r);if(v > max(L, R) || v < min(L, R)) {printf("-1\n");return 0;}while(l <= r) {int m = (l + r) >> 1, M = Calcsmu(m);if(M == v) {printf("%d\n", m); return 0;}if(L <= R) {if(v < M) r = m, R = M;else l = m, L = M;} else {if(v < M) l = m, L = M;else r = m, R = M;}}return 0;
}

LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告相关推荐

  1. loj#6100. 「2017 山东二轮集训 Day1」第一题 主席树+二分

    题目描述: 小火车沉迷垃圾手游不能自拔,正在玩碧蓝航线,可惜小火车的舰(lao)队(po)练度太低打不过副本,所以他只好去刷其余的副本来升级. 总共有 n 个副本编号从 1 到 n ,每个副本有个难度 ...

  2. Loj #6077. 「2017 山东一轮集训 Day7」逆序对

    Loj #6077. 「2017 山东一轮集训 Day7」逆序对 Solution 令fi,jf_{i,j}fi,j​表示前iii个数产生jjj个逆序对的方案数,每次考虑把i+1i+1i+1加入,有i ...

  3. LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告

    LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告 好苹果会组成连通块,整棵树的权值为 ∑ i = 1 n c i [ c i ≥ 0 ] [ s i z n u m ( c i ...

  4. LOJ#6074. 「2017 山东一轮集训 Day6」子序列

    LOJ#6074. 「2017 山东一轮集训 Day6」子序列 先考虑全局询问怎么做,设 f ( i , c ) f(i,c) f(i,c) 表示在 S 1 ⋯ i S_{1\cdots i} S1⋯ ...

  5. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]

    题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...

  6. loj #6070. 「2017 山东一轮集训 Day4」基因

    回文自动机好题啊! 解法一 每$\sqrt n \(分一块 每块建回文自动机到字符串末尾. 顺便开三个\)\sqrt n * n\(的数组记下预处理答案,回文自动机头指针,和每个节点第一次出现的右端点 ...

  7. 「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)

    题目描述 给出一个长度为  的数列  和一个长度为  的数列 ,求  有多少个长度为  的连续子数列能与  匹配. 两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对 ...

  8. #6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)

    #6073. 「2017 山东一轮集训 Day5」距离 给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集 ...

  9. 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对

    文章目录 Co-prime source solution code Character Encoding source solution code Tree and Constraints sour ...

最新文章

  1. 公司用--页面表单提交用的key是拼接的,保存时action的写法,struts1
  2. uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
  3. android 测试网,Android Monkey测试
  4. 运行jar程序批处理bat程序编写
  5. draw graph using gnuplot
  6. 4月02日 提取汉字首字母,并大写的类
  7. ps、top 、free查看用户资源信息
  8. err=etherbase address must be explicitly specified
  9. 开源网站项目-静态网址导航网站
  10. 【转载】数据库操作系统——Visual FoxPro 6.0安装步骤
  11. GBT 39323-2020 乘用车车道保持辅助(LKA)系统性能要求及试验方法
  12. 利用Nginx反向代理解决服务器80端口被封
  13. android系统已停止运用,安卓系统平板电脑启动器停止运行处理方法(文/明)
  14. bugkuCTF 乌云邀请码 write up【橘小白】
  15. 阅读分享-超抵抗力最大的路径走
  16. 从SS7到VOIP sip
  17. 造轮子之后台管理模板
  18. 语义分割论文-DeepLab系列
  19. 苏州优步车主之家司机端下载
  20. 西门子培训2——OID

热门文章

  1. Discovery Studio | Multi-Site Lambda Dynamics (MSLD) 进行自由能计算
  2. IPv6协议族的其它协议
  3. quotacheck: Cannot create new quotafile /data/aquota.group.new: Permission denied
  4. 《点亮ISINK三色灯》
  5. 【力扣刷题 | 第十九天】
  6. Ubuntu 18.04安装FSL软件
  7. Mac- .bash_profile解密
  8. php开发博客系统源码,php简单博客系统
  9. 可编程并行接口8255
  10. Java SSL与TLS客户端证书配置