传送门!

题目在里...

题目大意?

难道不是说的很清楚了么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. JDK8新特性之重复注解

    什么是重复注解 下面是JDK8中的重复注解(java.lang.annotation.Repeatable)定义的源码. @Documented @Retention(RetentionPolicy. ...

  2. C# WinForm 第一个项目控件使用心得

    1.控件心得 1.1 基础控件 panel 作用:布局 难点:重绘边框改变颜色 重绘panel里如果有fill填充控件 panle的padding要改个值 private void pnlPaintB ...

  3. js浮点数的计算总结

    在js浮点值的计算中,很多时候会出现不准确的情况,如下面的情况 console.log(2.2 + 2.1) // 4.300000000000001 console.log(2.2 - 1.9) / ...

  4. git 和github简介

    关于github不清楚的可以百度, 在这里,可以创建一个新的仓库 点击Create repository后会出现下面这些信息,其中第一块是仓库的url链接 第二块是你在本地目录中创建一个READEME ...

  5. add new color number to the color drop down in enovia PLM

    Ticket description:A55482L Ticket attachment: Open the attached page 2. Open the internationalizing ...

  6. 关于元素的offsetHeight、line-htight

    最近在做一个自适应高度的加载时的瀑布效果,使用加载完毕后为其一个A容器设置style的高度的方式完成(原高度为0且超出部分裁剪),使用offsetHeight获取其子元素高度(所有子元素高度均相等), ...

  7. NX二次开发-UFUN获取边的端点UF_MODL_ask_edge_verts

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> #include <uf ...

  8. hdu多校第六场1012 (hdu6645) Stay Real 假博弈,真贪心

    题意: 给你一个小根堆,从根开始拿,拿走子节点被拿完后才可以拿走父节点,两个人依次拿,谁拿的节点总和大谁获胜,问你谁有必胜策略. 题解: 小根堆中,每个点的权值总是不小于父亲节点的权值.所以无论怎么取 ...

  9. POJ3436:ACM Computer Factory-最大流

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  题目真难读懂 有\(n\)台机器,每台机器有\(p\)个部分,每台机 ...

  10. javascript es6 语法快速入门

    1. let.const 作用:let 声明变量,const 声明常量 与 var 的区别:不能重复声明,且存在块级作用域,即只在代码块内生效 2. 箭头函数 使用: let show = funct ...