【题解】JXOI2018游戏(组合数)
【题解】JXOI2018游戏(组合数)
题目大意
对于\([l,r]\)中的数,你有一种操作,就是删除一个数及其所有倍数。问你删除所有数的所有方案的步数之和。 由于这里是简化题意,有一个东西没有提到: 你可以“删除”已经被删除的点。而且即使你已经删掉了所有的数,若你仍然要继续操作直到做了\(r-l+1\)次不同的删除动作。这将计入方案。
可能还是没有讲清楚,可以去康康原题...
实际上我想写一下题解是因为一个思想的方法...
考虑将\([l,r]\)每一个数向他的倍数连边。这可以形成一个拓扑图。删除一个点\(x\)的效果就是将拓扑图中所有能被\(x\)到达的点删掉。那么删除整张图的充分必要条件是所有入度数为\(0\)的点被删除掉。那么考虑那些入度为\(0\)的数是哪些。一些数被连边是由于在区间中存在他的因数,所以一个数没有被进入是因为他的最大约数小于边界\(l\)。考虑如何筛选出最大约数小于某个值的数,可以让这个数除去他的最小因子——最小因子=最小的质因子。所以可以直接线性筛所有数的最小质因子即可。
其实上面这段话可以用三个显然概括掉,但是我想记录一下这个思路,所以写得很啰嗦清晰。
考虑一个删数的方案其实是一个排列。记\(n=r-l+1,m=\)入度等于0的点个数。
枚举删除需要\(i\)步,也就说\(m\)个数字要在第\(i\)位正好全部出现。那么对于前面\(i \ge m\)个位置,先钦定一个放在第\(i\)位也就是\(m \choose 1\),然后剩下的随便排列就是\((m-1)!\)但是有一些缺的位置那么从后面选点过来填上就是\(A_{n-m}^{i-m}\) 然后剩下的数随便排列也就是\((n-i)!\)。
最终答案:
\]
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1e7+5;
const int mod=1e9+7;
int usd[maxn],Min[maxn];
int jc[maxn],inv[maxn];
vector<int> ve;
inline int ksm(const int&base,const int&p){
int ret=1;
for(int t=p,b=base%mod;t;t>>=1,b=1ll*b*b%mod)
if(t&1) ret=1ll*ret*b%mod;
return ret;
}
inline void pre(const int&n){
jc[0]=inv[0]=1;
for(register int t=1;t<=n;++t) jc[t]=1ll*jc[t-1]*t%mod;
inv[n]=ksm(jc[n],mod-2);
for(register int t=n-1;t;--t) inv[t]=1ll*inv[t+1]*(t+1)%mod;
Min[1]=10; usd[1]=1;
for(register int t=2;t<=n;++t){
if(!usd[t]) ve.push_back(t),Min[t]=t;
for(register auto i:ve){
if(1ll*i*t>n) break;
usd[i*t]=1;
Min[i*t]=min(Min[t],i);
if(t%i==0) break;
}
}
}
inline int c(const int&n,const int&m){
if(n<m)return 0;
return 1ll*jc[n]*inv[m]%mod*inv[n-m]%mod;
}
int l,r,m,n;
int main(){
l=qr(); r=qr();
n=r-l+1;
pre(r+3);
for(register int t=l;t<=r;++t) if(t<1ll*l*Min[t]) ++m;
int ans=0;
for(register int t=m,ret;t<=n;++t){
ret=1ll*t%mod*m%mod*c(n-m,t-m)%mod*jc[t-1]%mod*jc[n-t]%mod;
ans=(ans+ret)%mod;
}
printf("%d\n",ans);
return 0;
}
【题解】JXOI2018游戏(组合数)的更多相关文章
- 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)
[BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...
- [JXOI2018]游戏 (线性筛,数论)
[JXOI2018]游戏 \(solution:\) 这一道题的原版题面实在太负能量了,所以用了修改版题面. 这道题只要仔细读题,我们就可以将题目的一些基本性质分析出来:首先我们定义:对于某一类都可以 ...
- BZOJ5323 & 洛谷4562:[JXOI2018]游戏——题解
https://www.luogu.org/problemnew/show/P4562 https://www.lydsy.com/JudgeOnline/problem.php?id=5323 (B ...
- [JXOI2018]游戏
嘟嘟嘟 九条可怜竟然有这种良心题,似乎稍稍刷新了我对九条可怜的认识. 首先假设我们求出了所有必须要筛出来的数m,那么\(t(p)\)就只受最后一个数的位置影响. 所以我们枚举最后一个数的位置,然后用组 ...
- [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]
Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...
- BZOJ5323 JXOI2018游戏(线性筛+组合数学)
可以发现这个过程非常类似埃氏筛,将在该区间内没有约数的数定义为质数,那么也就是求每种方案中选完所有质数的最早时间之和. 于是先求出上述定义中的质数个数,线性筛即可.然后对每个最短时间求方案数,非常显然 ...
- BZOJ5323 [Jxoi2018]游戏 【数论/数学】
题目链接 BZOJ5323 题解 有一些数是不能被别的数筛掉的 这些数出现最晚的位置就是该排列的\(t(p)\) 所以我们只需找出所有这些数,线性筛一下即可,设有\(m\)个 然后枚举最后的位置 \[ ...
- BZOJ5323 JXOI2018 游戏
传送门 这是我见过的为数不多的良心九怜题之一. 题目大意 有一堆屋子,编号为$l,l+1...r-1,r$,你每次会走入一个没走入过的房子,然后这个房子以及编号为这个房子编号的倍数的房子就会被自动标记 ...
- P1000题解 超级玛丽游戏
P1000这么难,必须要水一篇题解/斜眼笑 ******** ************ ####....#. #..###.....##.... ###.......###### ### ### .. ...
随机推荐
- @codeforces - 141E@ Clearing Up
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点 M 条边的图,每条为黑色或者白色. 现在让你 ...
- OpenStack☞HTTP协议
前言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准 HTTP是一个基于TCP/IP通信协议 ...
- C++高精度加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- git之本地仓库关联远程仓库
首先新建一个github respository 然后在自己本地新建一个maven项目,里面写点东西 如下图,将自己的项目所在地设置为本地git仓库 将本地仓库与远程关联,首先获取远程仓库的地址,点击 ...
- 使用基于Apache Spark的随机森林方法预测贷款风险
使用基于Apache Spark的随机森林方法预测贷款风险 原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...
- 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...
- C# 标准性能测试
经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试. 本文告诉大家如何使用 benchmarkdotnet 做测试. 现在在 github 提交代码,如果有小 ...
- Python 数据类型,常用函数方法分类
Python基本数据类型:(int) 字符串(str)列表(list)元组(tuple)字典(dict)布尔(bool) python中可以简单使用 类型(数据)创建或转换数据 例: #字符串转数字 ...
- Python--day46--mysql触发器
触发器:当对某张表做:增删改操作时,可以使用触发器自定义关联行为 1,为什么需要创建mysql触发器? 比如说我往tb1表里面插入一条数据的时候,同时需要往日志表tb2中插入这条数据,这时候就需要创造 ...
- Vmware虚拟机用户密码忘记了怎么办?
Vmware虚拟机用户密码忘记了怎么办? 虚拟机Linux上用户密码忘记了怎么办? 今天准备再学习一下linux操作系统,由于之前已经安装过vaware和linux(redhat),所以这次认为不 ...