[JXOI2018]游戏



$ solution: $

这一道题的原版题面实在太负能量了,所以用了修改版题面。

这道题只要仔细读题,我们就可以将题目的一些基本性质分析出来:首先我们定义:对于某一类都可以被x整除的数(要在 $ [l,r] $ 之内),若x也在我们的 $ [l,r] $ 之内且x不能被 $ [l,r] $ 内任意其它数整除,我们称这类数为关联数且x为特殊数,(显然:当九条可怜查了x这间办公室后,所有以x为特殊数的关联数都不需要再检查了!)(而且:这一类以x为特殊数的关联数,只有且只要当x被检查后,这一类数都不需要检查了!)

然后我们可以将 $ [l,r] $ 内所有的数,都分为以不同数为特殊数的关联数。然后我们发现只有且只要当所有的特殊数都被检查后,整个 $ [l,r] $ 就都不需要检查了(这个可以根据上面括号里的第二条性质推出来)。所以我们用线性筛把这一类特殊数筛出来(我们不难发现对于一个数x,如果它除以它的最小因子(得到比它小的最大的约数),如果它不在 $ [l,r] $ 内,则说明它是一个特殊数)。然后我们可以枚举最后一个特殊数在操作序列中出现的位置(假设现在枚举到i),于是这个序列的后面一部分(即n-i个数)就无关紧要了,这相当于我们从tot(假设 $ [l,r] $ 中不是特殊数的有tot个)个非特殊数中取出n-i个数随便排列,然后i之前特殊数和非特殊数也可以随便排列。

于是我们得出答案就是:

$ ans=\sum_{i=tot}^n i\times tot\times C\tbinom{n-i}{n-tot}\times (n-i)!\times (i-1)! $

按顺序:(枚举最后一个特殊数的位置)(最后一个特殊数数在i结束,会有i的贡献)(这个位置可以是tot里的任意一个特殊数)(从剩下的非组合数n-tot个中取出n-i个放在i后面)(后面的n-i个非特殊数数可以随便排列)(前面的i-1个数也可以随便排列)

于是我们可以暴力求阶乘,阶乘逆元,还有线性筛即可。



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; const int mod=1e9+7; int l,r,n,tot,ans;
int ni[10000005];
int jc[10000005];
int pr[10000005];
int use[10000005]; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} inline int ksm(ll x,int y,int p){
ll res=1;
while(y){
if(y&1)(res*=x)%=p;
(x*=x)%=p; y>>=1;
}return res;
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
l=qr(); r=qr(); n=r-l+1; jc[0]=1;
for(rg i=1;i<=r;++i)
jc[i]=(ll)jc[i-1]*i%mod;
ni[r]=ksm(jc[r],mod-2,mod);
for(rg i=r;i;--i)
ni[i-1]=(ll)ni[i]*i%mod;
if(l==1){printf("%lld\n",(ll)jc[r]*(n+1)%mod*ksm(2,mod-2,mod)%mod);return 0;}
for(rg i=2;i<=r;++i){
if(!use[i])use[i]=i,pr[++tot]=i;
for(rg j=1;j<=tot;++j){
if(pr[j]*i>r)break;
use[pr[j]*i]=pr[j];
if(!(i%pr[j]))break;
}
} tot=0;
for(rg i=l;i<=r;++i)if(i/use[i]<l)++tot;
for(rg i=tot;i<=n;++i){
(ans+=(ll)tot*jc[n-tot]%mod*jc[i]%mod*ni[i-tot]%mod)%=mod;
}printf("%d\n",ans);
return 0;
}

[JXOI2018]游戏 (线性筛,数论)的更多相关文章

  1. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  2. BZOJ5323 JXOI2018游戏(线性筛+组合数学)

    可以发现这个过程非常类似埃氏筛,将在该区间内没有约数的数定义为质数,那么也就是求每种方案中选完所有质数的最早时间之和. 于是先求出上述定义中的质数个数,线性筛即可.然后对每个最短时间求方案数,非常显然 ...

  3. 洛谷P4562 [JXOI2018]游戏 数论

    正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...

  4. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  5. 【数论线性筛】洛谷P1865 A%B problem

    题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对 ...

  6. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  7. 【数论】【莫比乌斯反演】【线性筛】bzoj2005 [Noi2010]能量采集

    http://blog.csdn.net/Clove_unique/article/details/51089272 Key:1.连接平面上某个整点(a,b)到原点的线段上有gcd(a,b)个整点. ...

  8. 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational

    看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332 代码里顺便把几个常用的线性筛附上了. Key:1.gcd(i,j)==1利用 ...

  9. 【数论】【莫比乌斯反演】【线性筛】bzoj2301 [HAOI2011]Problem b

    对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 100%的数据满足:1≤n≤50000,1≤a≤b ...

随机推荐

  1. jQuery添加和删除元素

    添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在 ...

  2. day11 map函数

    场景模拟:实现一个列表内所有元素 *2 的效果 普通的实现方式单个列表是可以做到很轻松的实现,但是如果我又多个列表都要这个操作,那每个都操作就会重复代码 ret = [] num_1 = [1,2,1 ...

  3. MT【204】离散型最值

    (联赛一试2006,14).将2006表示成5个正整数$x_1,x_2,x_3,x_4,x_5$之和.记$S=\sum\limits_{1\le i<j\le5}{x_ix_j}$问:(1) 当 ...

  4. 自学Linux Shell12.4-for命令

    点击返回 自学Linux命令行与Shell脚本之路 12.4-for命令 1. for命令 格式一 for var in list do commands done 格式二 for var in li ...

  5. 自学Linux Shell17.1-正则表达式

    点击返回 自学Linux命令行与Shell脚本之路 17.1-正则表达式 1. 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“ ...

  6. linux-shell数据重定向详细分析

    在了解重定向之前,我们先来看看linux 的文件描述符.linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写 ...

  7. Python文件和异常

    程序和运行时数据是在内存中驻留的,涉及到数据交换的地方,通常是磁盘.网络等,因此需要IO接口. IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单 ...

  8. CrossFire Round #481 div.3 978 打后感

    虚拟赛,头一次打div.3感觉好TM水啊...... 一共7道题,我A了6道,第7题有思路但是没时间了. 结果还是排在700多名,可能其他人也觉得太水了吧. 逐一解析题目: A好简单,因为不想离散化我 ...

  9. MQTT——取消订阅报文和断开连接报文

    笔者已经把连接报文,订阅报文,发布报文都讲解了完了.而接下来就是取消订阅报文和断开连接报文.和其他的报文比较的话,他们显示非常简单.甚至笔者觉得可以不必要拿出来讲.只要看一下MQTT文档就没有什么不清 ...

  10. des加密解密JAVA与.NET互通实例

    JAVA版本 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFacto ...