【学术篇】SDOI2008 沙拉公主的困惑
传送门!
题目在这里...
题目大意?
难道不是说的很清楚了么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})\)的乘积...)
然后处理这一坨的时候也很容易...递推即可.. 显然, 我们有
- 当\(i\)是质数时, \(mul_i=mul_{i-1}*\frac{i-1}{i}\)
- 否则\(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));
}
}
注意事项~
- 做乘法的时候要转long long,(当然你要是全用long long算当我没说
- 预处理的时候1的值作为边界值给出, 循环要从2开始
- 每一步都记得取模
- 输出的时候记得换行而不是空格(我是不是暴露了什么←_←
完结撒花
【学术篇】SDOI2008 沙拉公主的困惑的更多相关文章
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 洛咕 P2155 [SDOI2008]沙拉公主的困惑
洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...
- BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 6103 Solved: 2060[Submit][S ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3303 Solved: 1129[Submit][S ...
- 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
[BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...
- 【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数
[bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...
- 洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
P2155 [SDOI2008]沙拉公主的困惑 题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为\(1\)到\(N\)的阶乘,但是,政府只发行编号与\(M!\ ...
随机推荐
- 5-MySQL-Ubuntu-操作数据库的基本操作语句
注意: (1)每一条sql语句都是以分号(;)结尾! (2)数据库的默认charset不支持中文,所以每次在创建数据库的时候要指定字符集charset=utf8; (一) 查看当前时间: select ...
- linux下读取移动硬盘
前提是安装了ntfs-3g软件,系统才能识别到移动硬盘. 第一步.fdisk -l 该命令查看系统识别到的磁盘,如果移动硬盘系统能够识别, 在屏幕上会输出“/dev/sdb1”之类的字样. ...
- java中Class.getMethods()和Class.getDeclaredMethods()的区别
在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等.由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了get ...
- shell脚本中关于日期的操作
一.计算指定日期的前一天的日期 date -d "yesterday 20150401 " +%Y%m%d 二.如果获取当前日期的前一天 date -d " ...
- Vue开发实战
递归组件 关键是组件在模板内能调用自身,关键是name属性 首先我们先定义数据格式 list: [ { title: '标题1' }, { title: '标题2', children: [ { ti ...
- Java中的反射该如何使用?
1. 什么是反射 反射是一种功能强大且复杂的机制.Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性.对于任何一个对象,我们都能够对它的方法和属性进行调用.我们把这种 ...
- Redis Desktop Manager可视化工具连接不上redis
1.在centos中启动redis之后,redis进程也是可查的,但是一连接可视化工具就报错: can't connect to redis-server 2.原因分析: ①首先redis是肯定已经开 ...
- JavaScript ---- 原型,原型链(什么是原型)
和“闭包”一样,“原型”这个概念也经常被提起. 其实这个“概念”应该和构造函数,对象放在一起讲,但是由于时间关系,先把这部分抽取出来讲.再讲这个概念时我们先大致了解下JavaScript中的“对象”. ...
- Dart编程环境
本章讨论在Windows平台上为Dart设置执行环境. 使用DartPad在线执行脚本 您可以使用https://dartpad.dartlang.org/上的在线编辑器在线测试您的脚本.Dart编辑 ...
- 获取ThinkPHP
获取ThinkPHP的方式很多,官方网站(http://thinkphp.cn)是最好的下载和文档获取来源. 官网提供了稳定版本的下载:http://thinkphp.cn/down/framewor ...