[CQOI2015]选数(数论分块+杜教筛)

problem

洛谷链接

solution

L,HL,HL,H 的范围放缩 1K\frac 1 KK1,都除掉 KKK,特殊的 LLL 边界注意一下。

H←H/K,L←(L−1)/K+1H\leftarrow H/K,L\leftarrow (L-1)/K+1HH/K,L(L1)/K+1

问题转化为 [L,H][L,H][L,H] 中任选 NNN 个数 gcd=1\text{gcd}=1gcd=1 的方案数。

T(i):T(i):T(i):[L,H][L,H][L,H] 中选 NNN 个数 i∣gcdi|\text{gcd}igcd 的方案数,即 (⌊Hi⌋−⌊L−1i⌋)N(\lfloor\frac H i\rfloor-\lfloor\frac {L-1}i\rfloor)^N(iHiL1)N

t(i):t(i):t(i):[L,H][L,H][L,H] 中选 NNN 个数 i=gcdi=\text{gcd}i=gcd 的方案数。

根据定义显然有,T(i)=∑i∣dt(d)T(i)=\sum_{i|d}t(d)T(i)=idt(d)

莫比乌斯反演得 t(i)=∑i∣dμ(di)T(d)t(i)=\sum_{i|d}\mu(\frac{d}{i})T(d)t(i)=idμ(id)T(d)

答案即为 t(1)=∑i=1infμ(i)T(i)=∑i=1infμ(i)(⌊Hi⌋−⌊L−1i⌋)Nt(1)=\sum_{i=1}^{inf}\mu(i)T(i)=\sum_{i=1}^{inf}\mu(i)(\lfloor\frac H i\rfloor-\lfloor\frac {L-1}i\rfloor)^Nt(1)=i=1infμ(i)T(i)=i=1infμ(i)(iHiL1)N

H,LH,LH,L 非常大,不能直接线筛后整除分块。

但可杜教筛,设定一个阀值 MMM 预处理出 MMM 以内的 μ\muμ,同样整除分块后杜教筛能做到 O(H23)O(H^{\frac 2 3})O(H32)

T(i)T(i)T(i) 分类,假设 i∈[l,r]i\in[l,r]i[l,r]T(i)T(i)T(i) 都是一样的,那么对 ∑i=lrμ(i)\sum_{i=l}^r\mu(i)i=lrμ(i) 进行杜教筛迅速求和。

∑i=lrμ(i)=∑i=1rμ(i)−∑i=1l−1μ(i)\sum_{i=l}^r\mu(i)=\sum_{i=1}^r\mu(i)-\sum_{i=1}^{l-1}\mu(i)i=lrμ(i)=i=1rμ(i)i=1l1μ(i)。这样就化成了标准的杜教筛形式。

∑μ(i):ϵ=μ∗I\sum\mu(i):\epsilon=\mu*Iμ(i):ϵ=μIh↔ϵ;f↔μ;g↔Ih\leftrightarrow \epsilon;f\leftrightarrow \mu;g\leftrightarrow Ihϵ;fμ;gI

s(n)=∑i=1nf(i)=∑i=1nμ(i)s(n)=\sum_{i=1}^nf(i)=\sum_{i=1}^n\mu(i)s(n)=i=1nf(i)=i=1nμ(i)

g(1)s(n)=∑i=1nϵ(i)−∑i=2ng(i)s(⌊ni⌋)⇔s(n)=1−∑i=2ns(⌊ni⌋)g(1)s(n)=\sum_{i=1}^n\epsilon(i)-\sum_{i=2}^ng(i)s(\lfloor\frac n i\rfloor)\Leftrightarrow s(n)=1-\sum_{i=2}^ns(\lfloor\frac n i\rfloor)g(1)s(n)=i=1nϵ(i)i=2ng(i)s(in)s(n)=1i=2ns(in)

sss 函数进行记忆化递归,以及同样的整除分块。

这样子连 H−L≤1e5H-L\le 1e5HL1e5 的性质都没有用上!^_^ 这性质好像是拿来容斥递推用的。

一些省掉的推导☞莫比乌斯反演,杜教筛。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 1000005
int mu[maxn], prime[maxn];
bool vis[maxn];
unordered_map < int, int > mp;
int N, M, K, L, H, cnt;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}int solve( int n ) {if( n <= M ) return mu[n];if( mp.find( n ) != mp.end() ) return mp[n];int ans = 1;for( int l = 2, r;l <= n;l = r + 1 ) {r = n / ( n / l );( ans -= solve( n / l ) * ( r - l + 1 ) ) %= mod;}return mp[n] = ans;
}signed main() {scanf( "%lld %lld %lld %lld", &N, &K, &L, &H );H /= K, L = ( L - 1 ) / K + 1;M = min( (int)1e6, H );mu[1] = 1; for( int i = 2;i <= M;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt and i * prime[j] <= M;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) { mu[i * prime[j]] = 0; break; }else mu[i * prime[j]] = -mu[i];}}for( int i = 1;i <= M;i ++ ) mu[i] += mu[i - 1];L --; int ans = 0;for( int l = 1, r;l <= H;l = r + 1 ) {if( ! ( L / l ) ) r = H / ( H / l );else r = min( H / ( H / l ), L / ( L / l ) );( ans += qkpow( H / l - L / l, N ) * ( solve( r ) - solve( l - 1 ) ) ) %= mod;}printf( "%lld\n", ( ans + mod ) % mod );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

VS Code是一个年轻的编辑器&#xff0c;但是确实是非常犀利。通过本篇&#xff0c;老司机带你使用VS Code玩转Docker——相信阅读本篇之后&#xff0c;无论是初学者还是老手&#xff0c;都可以非常方便的玩转Docker了&#xff01;所谓是“工欲善其事必先利其器”&#xff0c;VS…

《算法竞赛进阶指南》 0x50 动态规划

题目后面加 ∗*∗ 表示题目过于简单或不具备特征性&#xff0c;不做题解 线性DP AcWing 271. 杨老师的照相排列 811人打卡 AcWing 272. 最长公共上升子序列 778人打卡(∗*∗) AcWing 273. 分级 536人打卡 AcWing 274. 移动服务 513人打卡 AcWing 275. 传纸条 568人打卡&#xf…

【送书活动】10分钟了解Docker,运维和开发视角有什么不同?

Docker 是 Golang 编写的&#xff0c; 自 2013 年推出以来&#xff0c;受到越来越多的开发者的关注。如今Docker无处不在&#xff0c;这是不争的事实。开发人员都很喜欢它&#xff0c;运维工程师也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的…

luogu P4240 毒瘤之神的考验(莫比乌斯反演+递推前缀和+数论分块)

problem 洛谷链接 solution ∑i1n∑j1mφ(ij)∑i1n∑j1mφ(i)φ(j)gcd⁡(i,j)φ(gcd⁡(i,j))\sum_{i1}^n\sum_{j1}^m\varphi(ij)\sum_{i1}^n\sum_{j1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi{(\gcd(i,j))}}i1∑n​j1∑m​φ(ij)i1∑n​j1∑m​φ(gcd(i,j))φ(i)φ(j…

可持久化(二)

文章目录【可持久化值域线段树/主席树】主席树代码【二维数点】例题【可持久化值域线段树/主席树】 P3834 【模板】可持久化线段树 1&#xff08;主席树&#xff09; 查询序列区间第k小&#xff0c;静态在线。给定 n 个整数构成的序列&#xff0c;将对于指定的闭区间查询其区间…

.NET Core / C# 开发 IOT 嵌入式设备的个人见解

( .NET Core 七龙珠 )一、IOT 平台的支持先看国内优秀的云计算IOT平台(不含QQ互联、小米IOT等针对特定产品的开发者平台&#xff0c;仅列出部分云计算厂商的IOT平台)阿里云 IOThttps://iot.aliyun.com/华为物联网https://developer.huawei.com/ict/cn/site-iot-next腾讯云 物联…

合成小丹(dp+二进制按位或+结论)

problem 给定 nnn 个在 [0,2ω−1][0,2^\omega-1][0,2ω−1] 内的整数。执行下面操作两种操作共 n−1n-1n−1 次&#xff1a; 选择两个整数 x,yx,yx,y 从数列中删去&#xff0c;并加入 ⌊x∣y2⌋\lfloor\frac{x|y}{2}\rfloor⌊2x∣y​⌋&#xff0c;这里的 | 表示按位或。选择…

P2633 Count on a tree

P2633 Count on a tree 题意&#xff1a; 给定一棵 n 个节点的树&#xff0c;每个点有一个权值。有 m 个询问&#xff0c;每次给你 u,v,k&#xff0c;你需要回答 u xor last 和 v 这两个节点间第 k 小的点权。 其中last 是上一个询问的答案&#xff0c;定义其初始为 0&#…

[NewLife.XCode]增量累加

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

King of Range

King of Range 题意&#xff1a; 给你n个数&#xff0c;有m个询问&#xff0c;每次询问一个x&#xff0c;问有多少个区间的最大值减最小值大于x 题解&#xff1a; 我一开始的想法 st表实现区间最大减最小&#xff0c;利用二分来找这个区间范围&#xff0c;复杂度O(nmlogn)&…

膜拜大丹(结论+二元环)

problem 有两个国家&#xff0c;国家 AAA 有 nnn 座城市&#xff0c;国家 BBB 有 mmm 座城市&#xff0c;两个国家间有若干条单向航线。 具体地&#xff0c;有长度为 nnn 的数组 aaa 和长度为 mmm 的数组 bbb。国家 AAA 的第 iii 座城市有单向航线可以到达国家 BBB 的 1∼ai1…

Jewels

Jewels 题意&#xff1a; 你的坐标是(0,0,0)&#xff0c;有m个宝物&#xff0c;分别坐标是是(xi,yi,zi),它的z坐标以每秒下沉vi深度&#xff0c;你每次获取一个宝物的费用是两者的距离的平方&#xff0c;每秒只能获取一个宝物&#xff0c;从第0秒开始&#xff0c;问获取所有宝…

[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[学习笔记] 二分图基础定理的相关证明

最小点集覆盖最大匹配 最小点集覆盖&#xff1a;选出最少的点使得每条边都至少有一个端点被选。 先证最小点集覆盖 ≥\ge≥ 最大匹配 假设最大匹配为 xxx&#xff0c;即有 xxx 条边两两之间没有公用点。 光覆盖这些边就要用到 xxx 个点。 “不少于”已证。 再证最小点集覆盖 …

Boxes

Boxes 题意&#xff1a; 有n个盒子&#xff0c;每个盒子里要么是黑球&#xff0c;要么是白球&#xff0c;你可以花C的代码得知剩下所有盒子中黑球数量和白球数量&#xff0c;(只是知道总数量&#xff0c;并不知道具体哪个盒子里是什么)&#xff0c;你可以可以花费wi的代价开第…

Double Strings

Double Strings 题意&#xff1a; 给你s和t两个字符串&#xff0c;在其中选出两个等长的子序列(可以不连续)a&#xff0c;b&#xff0c;满足a的字典序严格小于b的字典序&#xff0c;问方案数,答案mod(1e97) 题解&#xff1a; 好的方案的构成是一段相同的前缀一个不同的字符…

你真的了解用户吗?-浅谈《用户画像》的意义和方法

作者&#xff1a;陈炯关于作者系统集成项目管理高级工程师某大型国有银行高级质量管理师从事IT项目管理工作十余年具有丰富的开发与管理经验公司内部敏捷转型的发起者之一深度参与敏捷实践与总结大学校园里流传最广的一句话是什么&#xff1f;“防火防狼防师兄”。为什么师兄这…

[学习笔记] 二次剩余

二次剩余 对于素数 ppp 和数 aaa&#xff0c;满足 (a,p)1(a,p)1(a,p)1。&#xff08;注意 aaa 不一定小于 ppp&#xff09; 若 ∃xx2≡a(modp)\exist_{x}\ x^2\equiv a\pmod p∃x​ x2≡a(modp)&#xff0c;则称 aaa 是模 ppp 意义下的二次剩余&#xff0c;xxx 称为该二次剩余…

Script Lab 续:为 Officejs 开发配置 VSCode 环境

垫场AA&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念--------------------------------------------------前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具前期02&#xff1a;尝试&#xff1a;Script Lab&…

P3567 [POI2014]KUR-Couriers

P3567 [POI2014]KUR-Couriers 题意&#xff1a; 给一个长度为 n 的正整数序列 a。共有 m 组询问&#xff0c;每次询问一个区间 [l,r] &#xff0c;是否存在一个数在 [l,r]中出现的次数严格大于一半。如果存在&#xff0c;输出这个数&#xff0c;否则输出 0。 题解&#xff1…