【BZOJ3930】【CQOI2015】选数
【题目链接】
- 点击打开链接
【思路要点】
- 显然问题可以转化为\(K=1\)的形式。
- 那么,我们实际上要求\(\sum_{i_1,i_2,...,i_N=L}^{R}\epsilon(gcd(i_1,i_2,...,i_N))\)。
- \(=\sum_{i_1,i_2,...,i_N=L}^{R}\sum_{d/i_1,i_2,...,i_N}\mu(d)\)
- \(=\sum_{d=1}^{R}\mu(d)(\lfloor\frac{R}{d}\rfloor-\lfloor\frac{L-1}{d}\rfloor)^N\)
- 其中\((\lfloor\frac{R}{d}\rfloor-\lfloor\frac{L-1}{d}\rfloor)^N\)只有\(O(\sqrt{L}+\sqrt{R})\)种取值,而\(\mu(d)\)的前缀和可以通过杜教筛求得。
- 时间复杂度\(O(L^{\frac{2}{3}}+R^{\frac{2}{3}}+(\sqrt{L}+\sqrt{R})*LogN)\)。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 2e6 + 5; const int P = 1e9 + 7; template <typename T> void chkmax(T &x, T y) {x = max(x, y); } template <typename T> void chkmin(T &x, T y) {x = min(x, y); } template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f; } template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0'); } template <typename T> void writeln(T x) {write(x);puts(""); } int tot, prime[MAXN], f[MAXN]; int miu[MAXN], s[MAXN]; int sl[MAXN], sr[MAXN]; int n, l, r, k; void init() {miu[1] = s[1] = 1;for (int i = 2; i < MAXN; i++) {if (f[i] == 0) {f[i] = prime[++tot] = i;miu[i] = -1;}s[i] = (s[i - 1] + miu[i] + P) % P;for (int j = 1; j <= tot && prime[j] <= f[i]; j++) {int tmp = prime[j] * i;if (tmp >= MAXN) break;f[tmp] = prime[j];if (prime[j] == f[i]) miu[tmp] = 0;else miu[tmp] = -miu[i];}} } int getsl(int n) {int m = l / n, ans = 1;if (n < MAXN) return s[n];else if (sl[m] != -1) return sl[m];int now = 2;while (now <= n) {int nxt = n / (n / now) + 1;ans = (ans - 1ll * (nxt - now) * getsl(n / now) % P + P) % P;now = nxt;}return sl[m] = ans; } int getsr(int n) {int m = r / n, ans = 1;if (n < MAXN) return s[n];else if (sr[m] != -1) return sr[m];int now = 2;while (now <= n) {int nxt = n / (n / now) + 1;ans = (ans - 1ll * (nxt - now) * getsr(n / now) % P + P) % P;now = nxt;}return sr[m] = ans; } int power(int x, int y) {if (y == 0) return 1;int tmp = power(x, y / 2);if (y % 2 == 0) return 1ll * tmp * tmp % P;else return 1ll * tmp * tmp % P * x % P; } int main() {read(n), read(k), read(l), read(r);if (l % k == 0) l = l / k - 1;else l = l / k; r /= k;memset(sl, -1, sizeof(sl));memset(sr, -1, sizeof(sr));init();int now = 1, last = 0, ans = 0;while (now <= r) {int nxtl, nxtr;if (now <= l) nxtl = l / (l / now);else nxtl = r;nxtr = r / (r / now);if (nxtr <= nxtl) {ans = (ans + 1ll * (getsr(nxtr) - last + P) * power(r / now - l / now + P, n)) % P;last = getsr(nxtr); now = nxtr + 1;} else {ans = (ans + 1ll * (getsl(nxtl) - last + P) * power(r / now - l / now + P, n)) % P;last = getsl(nxtl); now = nxtl + 1;}}writeln(ans);return 0; }
【BZOJ3930】【CQOI2015】选数相关推荐
- BZOJ3930: [CQOI2015]选数
BZOJ3930: [CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案. 小z很好奇这样选出的数的最大公约数的规 ...
- [BZOJ3930][CQOI2015]选数(数论+容斥)
首先,进行如下处理: 1.如果 L L是KK的倍数,那么把 L L变为LK\frac{L}{K},否则变为 ⌊LK⌋+1 \lfloor\frac{L}{K}\rfloor+1. 2.把 H H变成⌊ ...
- [bzoj3930] [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演
[BZOJ3930][CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律 ...
- [CQOI2015]选数(杜教筛)
[CQOI2015]选数 推式子 根据题意可写出式子: ∑a1=LH∑a2=LH⋯∑an=LH[gcd(a1,a2-an)=k]∑a1=⌈Lk⌉⌊Hk⌋∑a2=⌈Lk⌉⌊Hk⌋⋯∑an=⌈Lk⌉⌊Hk ...
- 【BZOJ3930】选数(莫比乌斯反演倍数形式,杜教筛)
[BZOJ3930]选数 https://www.cnblogs.com/cjyyb/p/8303813.html
- 【反演复习计划】【COGS2433】【bzoj3930,CQOI2015选数】爱蜜莉雅的冰魔法
同bzoj3930. (日常盗题图) #include<bits/stdc++.h> #define N 1000010 #define yql 1000000007 #define ll ...
- bzoj 3930: [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- [CQOI2015]选数(数论分块+杜教筛)
problem 洛谷链接 solution 将 L,HL,HL,H 的范围放缩 1K\frac 1 KK1,都除掉 KKK,特殊的 LLL 边界注意一下. H←H/K,L←(L−1)/K+1H\le ...
- 洛谷P3172 [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
最新文章
- 实现Java Socket 客户端服务端交互实例
- PHP内核探索之变量(2)-理解引用
- python3的数据类型的有序无序
- java redis 批量删除key_Redis,就是这么朴实无华
- 【百家稷学】深度学习与计算机视觉核心理论与实践(中国地质大学实训)
- linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
- 数据结构(字典,跳跃表)、使用场景(计数器、缓存、查找表、消息队列、会话缓存、分布式锁)、Redis 与 Memcached、 键的过期时间、数据淘汰策略、持久化(RDB、AOF)
- 提高性能:流的非阻塞处理
- 可视化分析js的内存分配与回收
- 局域网Ubuntu与WinXP实现文件共享
- 携号转网全面启动后,新诈骗套路也跟上了!一招教你识别!
- ILSpy反编译工具的使用
- 【note】《软件体系结构》知识整理(1-5章)
- 拓端tecdat|R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列
- VB 源码 产生任意数之间随机数,支持负数
- 夯实Java基础系列21:Java8新特性终极指南
- 在本地计算机无法启动iis,IIS常见错误及解决方法
- Codeforces - Ivan and Burgers
- 领导力21法则-- 要点总结
- 报错:Unhandled exception
热门文章
- 牛客网——数据分类处理
- python 3.6.5官网下载步骤_python3.6下载
- 头部底部通栏,内容区域滚动布局
- 2014.09.28
- C#将数字自动翻译为中文,使用循环迭代的方式
- 求生之路显示服务器指令大全手机,求生之路2指令大全 求生之路2指令怎么用? (7) _地图指令_游侠网...
- Win10或win11安装sql2000或msde2000关键步骤
- OPPO造车,只差官宣?
- webpack打包实例详解
- 区分a++和++a,浅谈两者的效率问题