传送门!

题目在里...

题目大意?

难道不是说的很清楚了么OvO

求n!中与m!互质的数的个数..

题目分析.

显然的数论... 所以就是化式子呗..

一个很显然的性质就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\)...

而题目中说了\(m\leqslant n\), ∴ \(m!|n!\)

于是我们只需要计算\(m!\)中与\(m!\)互质的数的个数,然后乘以\(\frac{n!}{m!}\)即可..

我们发现上面加粗的这一坨就是\(\varphi(m!)\)嘛...

所以\(ans=\varphi(m!)*\frac{n!}{m!}\)

又有\(\varphi(x)=x*\prod_{i}^{n}(1-\frac{1}{p_i})\) 其中\(p_i\)表示x的质因数...

而\(m!=1*2*...*m\), 所以\(m!\)的质因数很显然就是不大于\(m\)的质数...

然后带入上式约掉\(m!\)就有了\(ans=n!*\prod_{i}^{n}\frac{p_i-1}{p_i}\) (其中\(p_i\leqslant m\)且\(p_i\)为质数)...

由于多组询问, 而且内存开了256MB不是 所以我们要预处理... 不然会T...

由于上式, 我们要预处理的东西有:

  • 筛素数(简单欧拉筛)
  • 阶乘(顺着乘一遍取模就行了)
  • 逆元(要递推求出所有数的哦) (所以最好用\(O(n)\)的, 不会的话直接看代码就行了 百度一下一堆详细讲解OvO)
  • \(mul_i=\prod_{i}^{n}\frac{p_i-1}{p_i}\)这一坨东西...(不大于\(m\)的质数\(p_i\)们的\((1-\frac{1}{p_i})\)的乘积...)

    然后处理这一坨的时候也很容易...递推即可.. 显然, 我们有
  1. 当\(i\)是质数时, \(mul_i=mul_{i-1}*\frac{i-1}{i}\)
  2. 否则\(mul_i=mul_{i-1}\)即可...

    这样就做完了.

实现代码:

#include <cstdio>
typedef long long LL;
const int X=1e7+3;
inline int gn(int a=0,char c=0){
for(;c<48||c>57;c=getchar());
for(;c>47&&c<58;c=getchar())
a=a*10+c-48; return a;
}
int inv[X],fac[X],eu[X],mul[X],pri[X/10],tot;
bool notp[X]; int T,R,M,N;
void prime(){
notp[1]=1;
for(int i=2;i<X;++i){
if(!notp[i])pri[++tot]=i;
for(int j=1;j<=tot&&i*pri[j]<=1e7;++j){
notp[i*pri[j]]=1; if(i%pri[j]==0) break;
}
}
}
void calcinv(){
inv[1]=1;
for(int i=2;i<X;++i){
inv[i]=(LL)(R-R/i)*inv[R%i]%R;
if(inv[i]<0) inv[i]+=R;
}
}
void calcfac(){
fac[1]=1;
for(int i=2;i<X;++i)
fac[i]=(LL)fac[i-1]*i%R;
}
void calcmul(){
mul[1]=1;
for(int i=2;i<X;++i)
if(!notp[i]) mul[i]=(LL)mul[i-1]*(i-1)%R*inv[i]%R;
else mul[i]=mul[i-1];
}
int main(){
T=gn(),R=gn();
prime(); calcinv(); calcfac(); calcmul();
while(T--){
N=gn(),M=gn();
printf("%d\n",(int)((LL)fac[N]*mul[M]%R));
}
}

注意事项~

  1. 做乘法的时候要转long long,(当然你要是全用long long算当我没说
  2. 预处理的时候1的值作为边界值给出, 循环要从2开始
  3. 每一步都记得取模
  4. 输出的时候记得换行而不是空格(我是不是暴露了什么←_←

完结撒花

【学术篇】SDOI2008 沙拉公主的困惑的更多相关文章

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

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

  2. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  3. 洛咕 P2155 [SDOI2008]沙拉公主的困惑

    洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...

  4. BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 6103  Solved: 2060[Submit][S ...

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

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

  6. 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  7. 【bzoj2186】[Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3303  Solved: 1129[Submit][S ...

  8. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

    [BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...

  9. 【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数

    [bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...

  10. 洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告

    P2155 [SDOI2008]沙拉公主的困惑 题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为\(1\)到\(N\)的阶乘,但是,政府只发行编号与\(M!\ ...

随机推荐

  1. docker常用

    1. docker 查看正在运行 2. docker 查看所有  3. docker 查看镜像 4. docker 运行使用 docker run --name 镜像名(自己起的镜像名字)-d(后台) ...

  2. centos7下的nfs配置

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. nfs为什么需要RPC?因为NFS支持的功能很多,不同功能会 ...

  3. Dubbo面试20问!这些题你都遇到过吗?

    作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...

  4. Java中static关键字,this关键字

    static修饰的成员方法和成员变量都是类方法和类变量,随类的加载而加载 static方法可以直接调用另一个static方法 static中调用普通方法可以通过类的实例对象调用 static不可以修饰 ...

  5. Linux程序设计学习笔记(独乐乐版)

    在Android的开发过程中经常会遇到Linux相关的问题,为了更彻底的了解Linux准备整点没用的,找到一本 <Linux程序设计>开始系统的学习. 期间记录下自认为重要的内容,本以为是 ...

  6. w - 显示已经登录的用户以及他们在做什么

    总览 (SYNOPSIS) w - [husfV] [user] 描述 (DESCRIPTION) w 显示 系统中 当前用户 的 信息, 以及 他们 的 进程. 第一行 中 依次 显示 当前时间, ...

  7. 关于apache 重定向设定

    本人在研究关于apache重定向的资料,在网上找了很多,但是就本人来说,方便理解的,找到了这么一个,记录了下来,原帖地址:http://www.exehack.net/8.html 关于apache配 ...

  8. struts2验证器

    1. Struts2 的验证(note6,struts2-8) 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >&g ...

  9. jdk源码阅读-ConcurrentLinkedQueue(一)

    说明 concurrentLinkedQueue为无界非阻塞队列,是线程安全的 内部结构为链表的形式, 内部使用cas保存线程安全.采用cas保证原子性 什么是CAS CAS 操作包含三个操作数 —— ...

  10. 【持续更新】leetcode算法-数组篇

    会在近期陆续地完成数组篇的整理,希望对找工作的小伙伴有所帮助.   1.Two Sum:两数相加为一固定值,求其下标.一次遍历数组,用一个hash表存储已经访问过的数及其下标,对于新访问的数value ...