题目

https://www.luogu.com.cn/problem/P4562

沉迷水题无法自拔(感觉校赛要大寄特寄qwq)

思路

可以fa现可怜的检查和员工的通风报信类似一个筛法的过程,当区间中所有的数都被筛到至少一遍时,这个过程就结束了。

然后我们考虑什么情况下区间会被筛完。简单分析一下可知,对于\(a\in [l,r]\),如果\(\exists b\neq a,b\in [l,r]\) 使得 \(b|a\) ,那么\(a\)对筛是没有贡献的,相当于没有筛。

因为\(a\)能筛到的\(b\)都能筛到,而且\(b\)必须筛一遍以保证它本身被筛到。

所以我们可以定义关键数:区间内不存在它的因数。于是\(t(p)=n\)意味着在排列的前n个数中,所有的关键数都出现了(满足n最小)。

所以在找出所有关键数之后,我们可以枚举最后一个关键数出现的位置,写出一个式子(假设一共有\(s\)个关键数,区间长度为\(n=r-l+1\)):

\[s!*(n-s)!\sum_{k=1}^{n} k*\tbinom{k-1}{s-1}
\]

前面是个常量,我们关注和式。

这个东西用生成函数求导的方法当然很套路,但是如果没有学过生成函数也没关系,我们有\(k\tbinom{k-1}{s-1}=s\tbinom{k}{s}\),把\(s\)提出去就是一个平行求和。

不管用什么方式,我们都可以得到\(s\tbinom{n+1}{s+1}\) 这个式子。

所以最终答案就是

\[s!*(n-s)!*s*\tbinom{n+1}{s+1}
\]

尽管算法时间复杂度的瓶颈并不在这里,但是有了封闭形式的结果总是令人愉快的 ⊂(‘ω’⊂ )))

然后我们考虑如何计算这个\(s\)。之前说过所谓的关键数满足:区间内不存在它的因数,这个性质与质数有几分相似,这启发我们,是不是只要对筛法进行一些魔改就能成功呢?

然后我们试着改一下欧拉筛。

然后我们就AC了(雾)。

代码

点击查看代码
#include<cstdio>
#include<cstdlib>
#define maxn (int)(1e7+10)
#define mod ((int)(1e9+7))
#define ll long long
using namespace std;
int l,r,book[maxn],p[maxn],cnt=0;
int f[maxn];
ll fac[maxn];
ll qpow(ll x,int p){
ll ans=1,base=x;
for(;p;p>>=1){
if(p&1) ans=ans*base%mod;
base=base*base%mod;
}
return ans;
}
ll inv(ll x){
return qpow(x,mod-2);
}
ll C(int n,int m){
return fac[n]*inv(fac[m])%mod*inv(fac[n-m])%mod;
}
int main(){
int i,j,n,m,sum=0;
ll ans=0;
scanf("%d%d",&l,&r);
if(l==1){
for(i=1;i<=r;++i) ans=(ans+i)%mod;
for(i=1;i<r;++i) ans=ans*i%mod;
printf("%lld",ans);
return 0;
}
for(i=2;i<=r;++i){
if(!book[i]) p[++cnt]=i;
for(j=1;j<=cnt&&p[j]<=r/i;++j){
book[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
for(i=l;i<=r;++i){
if(!f[i]) sum++;
for(j=1;j<=cnt&&p[j]<=r/i;++j){
f[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
n=r-l+1;
fac[0]=1;
for(i=1;i<=n+1;++i) fac[i]=fac[i-1]*i%mod;
ans=sum*C(n+1,sum+1)%mod;
// for(i=sum;i<=n;++i){
// ans+=i*C(i-1,sum-1);
// }
ans=ans*fac[n-sum]%mod*fac[sum]%mod;
printf("%lld",ans);
// system("pause");
return 0;
}

洛谷P4562 [JXOI2018]游戏的更多相关文章

  1. 洛谷P4562 [JXOI2018]游戏(组合数学)

    题意 题目链接 Sol 这个题就比较休闲了. \(t(p)\)显然等于最后一个没有约数的数的位置,那么我们可以去枚举一下. 设没有约数的数的个数有\(cnt\)个 因此总的方案为\(\sum_{i=c ...

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

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

  3. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  4. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  5. 洛谷 P1000 超级玛丽游戏

    P1000 超级玛丽游戏 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级 ...

  6. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  7. $loj10156/$洛谷$2016$ 战略游戏 树形$DP$

    洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...

  8. 洛谷P1000 超级玛丽游戏(洛谷新手村1-1-1)

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

  9. 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序

    洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...

  10. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. QtQuick与Qml介绍

    文章纲要: 1.QtQuick是什么 2.qml与QtQuick关系 一.QtQuick是什么 "quick--快速创建应用程序" "quick--Qt User Int ...

  2. 使用Mockito 对方法中的私有void方法

    这里用一段代码举例 public void ruleJudgement(Long tenantId, Long productId, Long equipId, List<ModelAttrib ...

  3. python官方文档:https://pypi.org/

    https://pypi.org/ Find, install and publish Python packages with the Python Package Index

  4. js复制图片

    ^(* ̄(oo) ̄)^:可以复制到微信和钉钉,文件夹中不可以复制 <!DOCTYPE html> <html lang="en"> <head> ...

  5. QT 使用QDomDocument::setContent()读XML文件总是返回false

    代码: if(!doc.setContent(&file)){读取失败操作}发现总是返回false: 使用如下代码调试: if(!doc.setContent(&file,&s ...

  6. QT--弹出新的对话框 show()/exec()的区别

    show()显示非模态对话框,exec()显示模态对话框. 非模态对话框不会阻塞程序的线程,因此 如果你的对话框时创建在栈上,跳出作用域之后,对象便销毁了,对话框会一闪而过: 如果使用new在堆上创建 ...

  7. Request processing failed;

    用 ssm 框架修改数据库数据时,出现了 Request processing failed; nested exception is org.mybatis.spring.MyBatisSystem ...

  8. Selenium私房菜系列8 -- 玩转Selenium Server【OO】

    本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始. 在<第一个Selenium RC测试案例>中,我们以命令&quo ...

  9. 解决 VSCode git commit 时 No such file or directory 报错问题

    在git 进行 commit 时出现了 Git: .git/hooks/pre-commit: line 2: ./node_modules/pre-commit/hook: No such file ...

  10. 使用Android studio配置软件签名,并在车机安装

    系统级APP,可在Androidmanifest.xml中配置属性,并使用系统级签名. 1. 签名方式 1.1 bulid.gradle(:app)中添加签名信息 1.2 使用Android stud ...