interlinkage:

https://www.luogu.org/problemnew/show/P4562

description:

solution:

  • 注意到$l=1$的时候,$t(p)$就是$1$出现的位置,答案就是$1$出现的位置之和;
  • 这启发我们找一些关键的数字,这些数字在$[l,r]$内不存在约数;
  • 结论是$t(p)$为最后一个关键数的位置;
  • 不妨反证法,假设当所有的关键数都被用掉时还有数字没有筛掉。设最后一个关键数的位置为$pos$,既然还没有全部筛完,那么在$[pos+1,n]$之间还存在数字没有被筛掉。对于其中一个没有被筛掉的数,由于它并不是关键数,那么它的某一个约数一定还没有被筛掉,那么它约数的约数也没有被筛掉...以此类推,直到一个在$[l,r]$之间没有约数的数还没有被筛掉,但我们又知道这样的数已经被用完了,假设不成立;
  • 我们可以通过埃氏筛算出关键数的个数$sum$;
  • 设$f_i$为$t(p)$等于$i$的排列个数,$n=r-l+1$,$f_i=sum*\dbinom{n-sum}{n-i}*(n-i)!*(i-1)!$;
  • $ans=\sum_{i=sum}^{n}f_i*i$;

code:

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll; const int N=1e7+;
const int mo=1e9+;
int l,r,sum,n;
bool vis[N];
int fac[N],finv[N];
int qpow(int a,int b)
{
int re=;
for (;b;b>>=,a=1ll*a*a%mo) if (b&) re=1ll*re*a%mo;
return re;
}
int C(int a,int b)
{
if (a==b||!b) return ;
return 1ll*fac[a]*finv[b]%mo*finv[a-b]%mo;
}
int main()
{
scanf("%d%d",&l,&r);
n=r-l+;
fac[]=;
for (int i=;i<=n;i++) fac[i]=1ll*fac[i-]*i%mo;
for (int i=l;i<=r;i++)
{
if (!vis[i])
{
sum++;
for (int j=i<<;j<=r;j+=i) vis[j]=;
}
}
finv[n]=qpow(fac[n],mo-);
for (int i=n-;i>=;i--) finv[i]=1ll*finv[i+]*(i+)%mo;
int ans=;
for (int i=sum;i<=n;i++)
{
(ans+=1ll*sum*C(n-sum,n-i)%mo*fac[n-i]%mo*fac[i-]%mo*i%mo)%=mo;
}
printf("%d\n",ans);
return ;
}

[JXOI 2018] 游戏 解题报告 (组合数+埃氏筛)的更多相关文章

  1. [JXOI 2018] 守卫 解题报告 (DP)

    interlinkage: https://www.luogu.org/problemnew/show/P4563 description: solution: 注意到对于范围$[l,r]$,$r$这 ...

  2. 解题:JXOI 2018 游戏

    题面 From ZRQ,很好的计数题 我们可以发现这$len=r-l+1$个数中有一些是必须被查到的,即它们不是一些数的倍数,它们的数目$imp$可以通过一次埃氏筛求出. 在一个排列中可怜查到某个位置 ...

  3. CodeForces - 385C Bear and Prime Numbers (埃氏筛的美妙用法)

    Recently, the bear started studying data structures and faced the following problem. You are given a ...

  4. cf1154G 埃氏筛应用

    直接用埃氏筛也可以做,但是这题写起来有点恶臭.. 更加简单的写法是直接枚举gcd=k,然后里面再枚举一次i*k,即找到k两个最小的倍数,看起来复杂度很高,但其实也是埃氏筛的复杂度 因为每次枚举gcd, ...

  5. 「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛

    题目描述 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 nnn 件珠宝.第 iii ...

  6. 埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解

    我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻) 虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛 于是就有了优化 这个优化还是比较 ...

  7. 埃氏筛+线段树——cf731F

    从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...

  8. 数论(8):min_25 筛(扩展埃氏筛)

    min_25 筛介绍 我们考虑这样一个问题. \[ans=\sum_{i = 1}^nf(i)\\ \] 其中 \(1 \le n \le 10^{10}\) 其中 \(f(i)\) 是一个奇怪的函数 ...

  9. U138097 小鱼吃大鱼 埃氏筛

    题目描述 小P同学在养殖一种非常凶狠的鱼,而且与其他鱼类不同,这种鱼越大越温顺,反而小鱼最凶残.当两条鱼相遇时, 小鱼会不断撕咬大鱼,每一口都咬下与它自身等重的肉(小鱼保持体重不变),直到大鱼的体重小 ...

随机推荐

  1. kotlin第一个项目的搭建

    怎么在Android Studio中使用Kotlin? 1.使用Android Studio的插件 2.将Android Studio升级到3.0版本:目前不推荐,因为3.0的版本目前还是Dev Ch ...

  2. WinDbg使用

    1.抓dump文件 程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并 ...

  3. Linux 帮助与语言设置以及(\)

    1.命令太长可以用反斜杠(\)来转义回车键,使用命令连续到下一行.注意:反斜杠后就立刻接着特殊字符才能转义. 2.修改语系为英文 LANG=en_US.utf8 export LC ALL=en_US ...

  4. C#写上位机中写曲线图的知识点(VS2019-WPF)

    最近在写一个上位机,为了与下位机软件串口进行通信以及一些数据的形象显示,做到曲线图这一块的时候出现了一些问题,我用的是VS2019(个人不能吐槽VS2019新版本,因为平时也很少用VS,下载的时候就直 ...

  5. 分别用for循环,while do-while以及递归方法实现n的阶乘!

    分别用for循环,while do-while以及递归方法实现n的阶乘! 源码: package book;import java.util.Scanner;public class Access { ...

  6. [置顶] tcpflow 抓包

    转自:  http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/ tcpflow 抓包 Apr 16, 2015 大家都知道 t ...

  7. 38.mapping小例子

    主要知识点 初步了解mapping     一,准备数据 插入几条数据,让es自动为我们建立一个索引     PUT /website/article/1 { "post_date" ...

  8. Golang - 处理json

    目录 Golang - 处理json 1. 编码json 2. 解码json Golang - 处理json 1. 编码json 使用json.Marshal()函数可以对一组数据进行JSON格式的编 ...

  9. oracle启动停止命令

    dba 连接 oracle(切到 oracle 用户) sqlplus /nolog conn / as sysdba 登录成功之后,关闭数据库服务 shutdown immediate 登录成功之后 ...

  10. HDU - 2973 - YAPTCHA

    先上题目: YAPTCHA Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...