题目

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了(雾)。

代码

点击查看代码
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #define maxn (int)(1e7+10)
  4. #define mod ((int)(1e9+7))
  5. #define ll long long
  6. using namespace std;
  7. int l,r,book[maxn],p[maxn],cnt=0;
  8. int f[maxn];
  9. ll fac[maxn];
  10. ll qpow(ll x,int p){
  11. ll ans=1,base=x;
  12. for(;p;p>>=1){
  13. if(p&1) ans=ans*base%mod;
  14. base=base*base%mod;
  15. }
  16. return ans;
  17. }
  18. ll inv(ll x){
  19. return qpow(x,mod-2);
  20. }
  21. ll C(int n,int m){
  22. return fac[n]*inv(fac[m])%mod*inv(fac[n-m])%mod;
  23. }
  24. int main(){
  25. int i,j,n,m,sum=0;
  26. ll ans=0;
  27. scanf("%d%d",&l,&r);
  28. if(l==1){
  29. for(i=1;i<=r;++i) ans=(ans+i)%mod;
  30. for(i=1;i<r;++i) ans=ans*i%mod;
  31. printf("%lld",ans);
  32. return 0;
  33. }
  34. for(i=2;i<=r;++i){
  35. if(!book[i]) p[++cnt]=i;
  36. for(j=1;j<=cnt&&p[j]<=r/i;++j){
  37. book[i*p[j]]=1;
  38. if(!(i%p[j])) break;
  39. }
  40. }
  41. for(i=l;i<=r;++i){
  42. if(!f[i]) sum++;
  43. for(j=1;j<=cnt&&p[j]<=r/i;++j){
  44. f[i*p[j]]=1;
  45. if(!(i%p[j])) break;
  46. }
  47. }
  48. n=r-l+1;
  49. fac[0]=1;
  50. for(i=1;i<=n+1;++i) fac[i]=fac[i-1]*i%mod;
  51. ans=sum*C(n+1,sum+1)%mod;
  52. // for(i=sum;i<=n;++i){
  53. // ans+=i*C(i-1,sum-1);
  54. // }
  55. ans=ans*fac[n-sum]%mod*fac[sum]%mod;
  56. printf("%lld",ans);
  57. // system("pause");
  58. return 0;
  59. }

洛谷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. docker 安装 服务

    服务所需 mysql,redis,nfs,rsync,nginx,以及自己的后端服务 mysql docker run --restart=always -d -v /etc/localtime:/e ...

  2. Cannot read property 'xxxx' of null

    在使用的vue3+element-plus的项目中,我使用了form表单对数据进行校验. 但是使用了: refDom.value.validate((valid) => {}) 后,过一会控制台 ...

  3. 使用elemeng-plus控制台报错:$weight

    使用element-plus最开始按需使用,加入的组件少没有问题,但组件引入多了以后发现控制台会报下面的警告: Deprecation Warning: $weight: Passing a numb ...

  4. 超级详细的Vue安装与配置教程

    原文: https://www.jb51.net/article/251371.htm 超级详细的Vue安装与配置教程   Vue web前端三大主流框架之一,是一套用于构建用户界面的渐进式框架,下面 ...

  5. COMP3357 Cryptography

    课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams Course ...

  6. Jenkins+Git+Gitlab+Ansible 持续集成和自动部署

  7. boost asio 网络编程案例简单改写

    boost教程:http://zh.highscore.de/cpp/boost/ 改写7.4网络编程案例,服务器支持连接多个客户端 服务端: #include <iostream> #i ...

  8. hutool调用第三方接口上传文件和下载文件

    1.上传文件接口例子(本地接口) 2.第三方接口 3.调用第三方接口下载文件 4.第三方接口 5.多个文件生成压缩文件

  9. signalR从外部服务中推送消息和全局参数的设置

    在前面的章节中,我们都是采用两方模式, 客户端 <-> 服务端,也就是说在这种情况下如果有第三方如果有通知的没有办法插足的,下面解决方案 1:和之前的代码一样,在index页面加一个客户端 ...

  10. mysql5.7 不兼容问题

    通过navicat工具导入psc数据库备份文件,报错如下,mysql版本5.7 执行如下语句不通过 DROP TABLE IF EXISTS `guard_user`; CREATE TABLE `g ...