传送门!

题目在里...

题目大意?

难道不是说的很清楚了么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. 拾遗:Git 常用操作回顾

    温故而知新,可以为师矣. Git 布局 工作区---->暂存区---->本地仓库---->远程仓库 Create Repository git init PATH git add P ...

  2. 一些识别CMS的经验方法总结

    今天学到了一些识别CMS的快速方法,也算是一种信息收集经验的积累,在这里要感谢一下我的同事“gakki的童养夫”对我的大力支持. 如何判断网站的CMS? robots.txt文件 robots.txt ...

  3. Gradle安装配置(Windows)

    在本教程中,我们将学习 Gradle 的安装,对于一个初学者,有时安装开发环境也是一个比较麻烦的问题.如果按照 Gradle 官方网站的说明安装,则可能会遇到一些麻烦,有时还要在互联网上做一些搜索,查 ...

  4. 【转】手机web页面制作时的注意事项

    一.手机页面的标准头规范 字符编码使用utf-8:指定页面手机内存缓存中的存储时间段 device-width:通知浏览器使用设备的宽度作为可视区的宽度 initial-scale - 初始的缩放比例 ...

  5. <随便写>软件设计遵循的基本原则

    1.高内聚,低耦合 所谓高内聚,是指一个软件模块内各个元素彼此结合的紧密程度要高,即一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则. 所谓低耦合,是指一个软件系统内不同 ...

  6. 搭建一个自己的SVN服务器

    其实方法非常简单,点点鼠标就好了. 上网搜索“VisualSVN Server”,一般来说都是会找到 https://www.visualsvn.com/server/ 这个网站的. 点击上边的Dow ...

  7. Linux 进程间通信 信号灯集

    1.特点:  信号灯集,是控制访问临界资源 信号灯(semaphore),也叫信号量.它是不同进程间或一个给定进程内部不同线程间同步的机制System V的信号灯是一个或者多个信号灯的一个集合(允许对 ...

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

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

  9. vue实现京东动态楼层效果

    页面效果如下 <template> <div> <h1>首页</h1> <section class="floor-nav" ...

  10. 用python 编写redis 暴力破解密码的程序

    本文摘自http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/ import redisimport l ...