当前位置: 首页 > news >正文

【题解】洛谷P3172 [CQOI2015] 选数[杜教筛]

题面:从 [L,H] 选 N 个数(可能重复),一共有 (H-L+1)^N 种取法。问这些取法中满足 N 个数最大公约数为 K 的有多少种。

第一眼就知道要把 L=\left \lfloor \frac{L}{K} \right \rfloor+[L\,mod\,K\neq 0]H=\left \lfloor \frac{H}{K} \right \rfloor

然后问题就变成求满足 N 个数最大公约数为 1 有多少种

然后就莫反+杜教筛,但还有递推做法,我都讲下。

(1)莫反+杜教筛做法

分两种推公式的方法,一种是造俩函数然后倍数莫反,我觉得不常用且不好想就没写在这里。

想看可以去这里

洛谷上LaTeX用的都挺感人的,我换种人能看的懂的方式。

题面:从 [L,H] 选 N 个数(可能重复),一共有 (H-L+1)^N 种取法。问这些取法中满足 N 个数最大公约数为 K 的有多少种。

第一眼就知道要把 L=\left \lfloor \frac{L}{K} \right \rfloor+[L\,mod\,K\neq 0]H=\left \lfloor \frac{H}{K} \right \rfloor

然后问题就变成求满足 N 个数最大公约数为 1 有多少种

公式:\sum_{a_1=L}^{H}\sum_{a_2=L}^{H}\sum_{a_3=L}^{H}...\sum_{a_N=L}^{H}[gcd(a_1,a_2,a_3...,a_N)=1]

没见过这么丑的,硬着头皮反演吧。

=\sum_{a_1=L}^{H}\sum_{a_2=L}^{H}\sum_{a_3=L}^{H}...\sum_{a_N=L}^{H}\sum_{d|gcd(a_1,a_2,a_3...,a_N)}^{}\mu (d)

=\sum_{d=1}^{H}\mu (d)\sum_{a_1=L}^{H}\sum_{a_2=L}^{H}...\sum_{a_N=L}^{H}[d|gcd(a_1,a_2,a_3...,a_N)]

=\sum_{d=1}^{H}\mu (d)\sum_{a_1=\frac{L}{d}}^{\frac{H}{d}}\sum_{a_2=\frac{L}{d}}^{\frac{H}{d}}...\sum_{a_N=\frac{L}{d}}^{\frac{H}{d}}

=\sum_{d=1}^{H}\mu (d)(\frac{H}{d}-\frac{L}{d})^N

注意这个 \frac{L}{d},直接除以 d 的话,有些情况会不符合我们想要的[L,H] 中所有的 d 的倍数”

考虑让 L-1,实际上 \left \lfloor \frac{H}{d} \right \rfloor-\left \lfloor \frac{L-1}{d} \right \rfloor=\left \lfloor \frac{H}{d} \right \rfloor-(\left \lfloor \frac{L}{d} \right \rfloor+[L\,mod\,d\neq 0])+1

同学们自己试下 L\,mod\,d=0 和 d=1 的情况就知道为什么了。

代码:

#include<bits/stdc++.h>
using namespace std;
template<typename T> void qread(T &x){x=0; int f=1; char c=getchar();for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;for(; isdigit(c); c=getchar()) x=x*10+(c-'0');x*=f;
}
typedef long long LL;
const int N=5e6+10;
const LL P=1e9+7;
int pr, prime[N];
LL mu[N];
bool v[N]; 
void init(){pr=0; memset(v, 0, sizeof(v));mu[1]=1; mu[0]=0;for(int i=2; i<=N-10; i++){if(!v[i]){pr++; prime[pr]=i;mu[i]=-1;} for(int j=1; (j<=pr) && (i*prime[j]<=N-10); j++){int p=prime[j];v[i*p]=1;if(i%p==0){mu[i*p]=0;break;}else mu[i*p]=-mu[i]; }}for(int i=1; i<=N-10; i++) mu[i]+=mu[i-1];
}
LL q_pow(LL a, LL b){LL res=1;while(b){if(b&1) res=res*a%P;a=a*a%P; b/=2;}return res;
}
LL n, K, L, H;
map<LL, LL> hsm;
LL calc(LL x){if(x<=N-10) return mu[x];if(hsm.find(x)!=hsm.end()) return hsm[x];LL res=1;for(int i=2, j; i<=x; i=j+1){j=x/(x/i);res=(res-calc(x/i)*(j-i+1)%P+P)%P;}return hsm[x]=res;
}
LL solve(){LL res=0; L--;for(int i=1, j; i<=H; i=j+1){if(!(L/i)) j=H/(H/i); //到了一定位置大家的 L/i都变成 0,没有参考价值了 else j=min(L/(L/i), H/(H/i));res=(res+q_pow(H/i-L/i, n)*((calc(j)-calc(i-1))%P+P)%P)%P;}return res;
}
int main(){init();qread(n); qread(K); qread(L); qread(H);H=H/K; L=((L%K==0)? L=L/K: L=L/K+1);printf("%lld\n", solve());return 0;
}

(2)递推做法

其实差不多,一样的容斥,本来应该超时的,不过本题 H-L 比较小可以钻空子。

(我个人不喜欢这个做法,就不讲了,可以去洛谷看题解)

http://www.dtcms.com/a/320030.html

相关文章:

  • 【mtcnn】--论文详解重点001之窗口滑动~
  • 板块三章节4——iSCSI 服务器(待更新)
  • python数据结构与算法(基础)
  • 栅栏密码的加密解密原理
  • RISCV instr 第31-40章
  • 钢卷矫平机背后的材料科学
  • 10-netty基础-手写rpc-定义协议头-02
  • 进程、网络通信方法
  • 机器学习通关秘籍|Day 04:梯度下降的概念原理、手动实现梯度下降
  • 商城小程序怎么做?如何开发母婴用品商城小程序?
  • Redis 编译错误:缺少静态库文件,如何解决?
  • 股指期货合约是个啥?怎么玩?
  • GitCode 7月:小程序积分商城更名成长中心、「探索智能仓颉!Cangjie Magic 体验有奖征文活动」圆满收官、深度对话栏目持续热播
  • 2025年我国半导体材料产业链全景分析
  • 遥感卫星领域的AI应用
  • 经营帮:重构企业经营全流程,打造产业互联网新生态
  • 靶场(二十九)---小白心得靶场体会---BitForge
  • MySQL 极简安装挑战:跨平台高效部署指南
  • C语言 16_day
  • 【Linux基础知识系列】第八十九篇 - 文件内容快速查看:使用cat与tac
  • 容器之王--部署Docker私有仓库harbor母盘步骤演练
  • 使用python基于langchain来写一个ai agent
  • TCP粘包问题详解与解决方案
  • 2025 年华数杯全国大学生数学建模竞赛C 题 可调控生物节律的 LED 光源研究--完整成品、思路、模型、代码、结果分享
  • Maven私服搭建--Nexus-3.82.0 Linux环境
  • 微服务平台需求-部署一体化文档V1.0
  • 计算机网络:固定网络位长度子网划分flsm和可变长子网掩码划分vlsm的区别
  • Liberica JDK 和普通JDK(如Oracle JDK、OpenJDK等)的差异
  • Spring MVC中HttpSession的详解
  • RocketMQ架构解析