【BZOJ2186】【SDOI2008】沙拉公主的困惑
Description
大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。
Input
第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n
Output
共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值
Sample Input
1 11
4 2
Sample Output
1
Hint
对于100%的数据,$1 \leq N , M \leq 10000000 $
Solution
由于\((m!)|(n!)\) 所以根据欧拉函数的性质,\(n!\)内与\(m!\)的数的个数为\(Ans=\frac {n!}{m!} \varphi (m!)\)
根据欧拉函数定义:\(为的素因子\varphi (N) = N\frac{\prod_{i=1}^k p_i-1}{\prod_{i=1}^k p_i},p_i为N的素因子\)
有\(\varphi(m!)=m!\frac{\prod_{i=1}^k p_i-1}{\prod_{i=1}^k p_i}\)其中,\(p_i\)为不超过m的素数
根据计算公式,有$$Ans=\frac {n!}{m!} \varphi (m!)=\frac {n!}{m!} m!\frac{\prod_{i=1}^k p_i-1}{\prod_{i=1}^k p_i} = n! \frac{\prod_{i=1}^k p_i-1}{\prod_{i=1}^k p_i} $$
维护3个信息,\(i!\),\(\prod_{i=1}^k p_i-1\),\((\prod_{i=1}^k p_i-1)^{-1}\)即可O(1)回答询问。
时间复杂度\(O(max(n))\).
Code
#include <stdio.h>
#define MN 10000005
#define R register
#define ll long long
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define endfile fclose(stdin),fclose(stdout)
inline int read(){
R int x; R bool f; R char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
int k[MN],inv[MN],pr[MN],fac[MN],n,m,T,p,pn;bool b[MN];
inline void prework(){
k[1]=1;for (R int i=2; i<=1e7; ++i){
k[i]=(ll)k[i-1]*i%p;
if (!b[i]) pr[++pn]=i;
for (R int j=1; j<=pn&&(ll)pr[j]*i<=1e7; ++j){
b[i*pr[j]]=1;
if (i%pr[j]==0) break;
}
}inv[1]=1;for (R int i=2; i<=1e7; ++i){
if (i>=p) break;
inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}fac[1]=1;for (R int i=2; i<=1e7; ++i){
fac[i]=fac[i-1];
if (!b[i]) fac[i]=(ll)fac[i]*(i-1)%p*inv[i%p]%p;
}
}
int main(){
T=read(),p=read();
prework();while(T--){
n=read(),m=read();
printf("%lld\n",(ll)k[n]*fac[m]%p);
}
}
【BZOJ2186】【SDOI2008】沙拉公主的困惑的更多相关文章
- 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] ...
- [bzoj2186][Sdoi2008]沙拉公主的困惑_数论
沙拉公主的困惑 bzoj-2186 Sdoi-2008 题目大意:求N!中与M!互质的数的个数. 注释:$1\le N,M\le 10^7$. 想法:显然是求$\phi(M!)$.这东西其实只需要将数 ...
- BZOJ2186: [Sdoi2008]沙拉公主的困惑
传送门 常规数论题,利用欧拉函数的相关性质. 题求$[1,N!]$中与$M!$互质的数的个数,且$M \leq N$.然后根据欧拉函数的相关性质很容易得出这道题的答案为$\frac{\phi (M!) ...
- BZOJ2186 SDOI2008沙拉公主的困惑(数论)
由于n!是m!的倍数,而对于每个与m!互质且小于m!的数x,x+m!.x+2*m!……也与其互质,所以答案即为(n!/m!)*φ(m!). φ(m!)=m!*∏(1-1/pi).其中的pi即为1~m中 ...
- [bzoj2186][Sdoi2008]沙拉公主的困惑——数论
题目大意 求 \[\sum_{i = 1}^{N!} [gcd(i, M!) = 1]\] 题解 显然,题目就是求 \[N!(1-\frac{1}{p_1})(1-\frac{1}{p_2})...\ ...
- 【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑
http://www.cnblogs.com/BLADEVIL/p/3490321.html http://www.cnblogs.com/zyfzyf/p/3997986.html 翻了翻题解,这两 ...
- 【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] 以及逆 ...
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3303 Solved: 1129[Submit][S ...
随机推荐
- 关于DLL的创建与使用简单描述(C++、C#)
前言 前一段时间在学关于DLL的创建与调用,结果发现网络上一大堆别人分享的经验都有点问题.现在整理分享一下自己的方法. 工具 Microsoft Visual Studio 2017 depends ...
- python 继承基础
class annamal: def chi(self): print(self.name + '吃') def he(self): print(self.name + '喝') class dog( ...
- python的dir、help、str用法
当你给dir()提供一个模块名字时,它返回在那个模块中定义的名字的列表.当没有为其提供参数时, 它返回当前模块中定义的名字的列表.dir() 函数使用举例: 1 2 3 4 5 6 >>& ...
- 大神都在看的RxSwift 的完全入坑手册
大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ...
- Tomcat 8项目无法启动,无报错
作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息: Log4j:[2015-10-29 ...
- 从PRISM开始学WPF(五)MVVM(一)ViewModel?
从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...
- Python 迭代器之列表解析
 [TOC] 尽管while和for循环能够执行大多数重复性任务, 但是由于序列的迭代需求如此常见和广泛, 以至于Python提供了额外的工具以使其更简单和高效. 迭代器在Python中是以C语言的 ...
- EasyUI导航栏。
html: <div data-options="region:'west',split:true" title="导航栏菜单" style=" ...
- 解决SoapFault (looks like we got no XML document)问题
今天在调试项目的时候出现下面的错误信息: SoapFault looks like we got no XML document (D:\phpStudy\WWW\self.shop.xunmall. ...
- 写一个vue组件
写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件 ...