【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑
http://www.cnblogs.com/BLADEVIL/p/3490321.html
http://www.cnblogs.com/zyfzyf/p/3997986.html
翻了翻题解,这两个合起来比较明白……
题意:求1~n!中与m!互质的数的数量(mod R)。
∵由欧几里得算法得gcd(a,b)=gcd(b,a%b)
∴gcd(a+b,b)=gcd(b,(a+b)%b)=gcd(b,a) 即 gcd(a,b)=gcd(a+b,b)
推广:gcd(a,b)=gcd(a+k*b,b)
∴若a与b互质,则a+k*b也与b互质
令n=5,m=4,则n!=120,m!=24
符合题意的数有以下:
5 29 53 77 101
7 31 55 79 103
11 35 59 83 107
13 37 61 85 109
17 41 65 89 113
19 43 67 91 115
23 47 71 95 119
∴若x(x<n!)与m!互质,则x+m!*k也和m!互质,根据我们刚才推出的性质,仔细观察,发现 x 在 mod m!的剩余系中恰好有n!/m!个数符合题意。
∴观察上表的第一列,我们只需考虑小于m!的数中与n!互质的数。
∴这样的数恰好有φ(m!)个
∴答案为φ(m!)*(n!/m!)
但是这样仍然超出了我们能承受的时间复杂度。
∴ans=φ(m!)*(n!/m!)
=m!*((p1-1)/p1)+((p2-1)/p2)+......+((pk-1)/pk)*n!/m! (p1......pk为m!的质因子,根据阶乘的定义,易证,m!的质因子恰好为<=m的所有质数)
=((p1-1)/p1)+((p2-1)/p2)+......+((pk-1)/pk)*n!
∴我们递推预处理出((p1-1)/p1)+((p2-1)/p2)+......+((pk-1)/pk)和n!即可O(1)地回答每个询问。
在预处理连续乘积的时候,我们要用到快速幂求乘法逆元。
综上,要预处理的是:
①maxm以内的素数
②maxm以内的素数的逆元
③1!~maxn!
④maxm以内的素数的((p1-1)/p1)+((p2-1)/p2)+......+((pk-1)/pk)
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
ll MOD;
int T,n[],m[],maxn,maxm,Ni[],Fac[],Muls[];
bool unPrime[];
void Shai_Prime()
{
unPrime[]=true;
for(ll i=;i<=maxm;i++)
for(ll j=i*i;j<=maxm;j+=i) unPrime[j]=true;
}
ll pow_mod(ll a,ll p,ll MOD)
{
if(!p) return ;
ll ans=pow_mod(a,p>>,MOD);
ans=ans*ans%MOD;
if((p&)==) ans=ans*a%MOD;
return ans;
}
void Init_Ni()
{
for(int i=;i<=maxm;i++)
if(!unPrime[i])
Ni[i]=(int)pow_mod(i,MOD-,MOD);
}
void Init_Fac()
{
Fac[]=;
for(int i=;i<=maxn;i++) Fac[i]=(int)((ll)Fac[i-]*(ll)i%MOD);
}
void Init_Muls()
{
ll res=;
for(int i=;i<=maxm;i++)
{
if(!unPrime[i]) res=((res*(ll)(i-))%MOD)*(ll)Ni[i]%MOD;
Muls[i]=res;
}
}
int main()
{
scanf("%d",&T); cin>>MOD;
for(int i=;i<=T;i++)
{
scanf("%d%d",&n[i],&m[i]);
maxn=max(n[i],maxn);
maxm=max(m[i],maxm);
}
Shai_Prime(); Init_Ni(); Init_Fac(); Init_Muls();
for(int i=;i<=T;i++)
printf("%d\n",(int)((ll)Muls[m[i]]*(ll)Fac[n[i]]%MOD));
return ;
}
【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑的更多相关文章
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...
- 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模
题目地址:http://ac.jobdu.com/problem.php?pid=1085 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k). ...
- The 2018 ACM-ICPC China JiangSu Provincial Programming Contest快速幂取模及求逆元
题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest 35.4% 1000ms 65536K Persona5 Per ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)
Carmichael Numbers An important topic nowadays in computer science is cryptography. Some people e ...
- BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 6103 Solved: 2060[Submit][S ...
- 欧拉函数phic以及超大数的快速幂
题目:求a^b*c%mod; 其中b<=10^100000; 是不是很大..... /*当你要计算 A^B%C的时候 因为此题中的B很大,达到10^100000,所以我们应该联想到降幂公式. 降 ...
随机推荐
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B
B. Problems for Round time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- word使用宏 在文章中插入源代码进行排版
1.宏的代码如下. Sub 设置代码表格() ' author: code4101 ' 设置代码表格 宏 ' ' ' 背景色为morning的配色方案,RGB为(229,229,229) ) With ...
- git分支开发,分支(feature)同步主干(master)代码,以及最终分支合并到主干的操作流程
由于rebase执行速度慢,分支同步主干代码时,分支的每次提交都可能和主干产生冲突,需要解决的次数太多,影响提交效率. 同时,为了保证主干提交线干净(可以安全回溯),所以采用下面所说的merge法. ...
- 遍历文档内容,得到HTML层级结构
嗯..没发现有写好的,那就自己写一个,刚好自己今天看了DOM操作的知识点,巩固一下. HTML可以表示为一个层次结构,生成的DOM Tree 就是类似与数据结构中的树一样,每个DOM节点都有它的chi ...
- Linux内核线程之深入浅出【转】
转自:http://blog.csdn.net/yiyeguzhou100/article/details/53126626 [-] 线程和进程的差别 线程的分类 1 内核线程 2 轻 ...
- canvas的基础使用。
目录: 创建canvas. 绘制直线.多边形和七巧板. 绘制弧和圆. (有些图过于宽,被挤压了.可以去相册[canvas用到的图.]看原图.) 创建canvas. HTML5的新标签<canva ...
- Long类型的坑,第一次遇见
注意下面标红的code,如果不加这段代码会有问题,原因是一个比较的是地址,一个比较的是value,会导致不同,程序逻辑出错!加上后比较的就是值!!! allViewMap.put("proj ...
- 7.Redis键值对数据库
1.Redis的安装以及客户端连接 安装:apt-get install redis-server 卸载:apt-get purge --auto-remove redis-server 启动:red ...
- docker从零开始 存储(五)存储驱动介绍
关于存储驱动程序 要有效地使用存储驱动程序,了解Docker如何构建和存储镜像以及容器如何使用这些镜像非常重要.您可以使用此信息做出明智的选择,以确定从应用程序中保留数据的最佳方法,并避免在此过程中出 ...
- hdu 5184(数学-卡特兰数)
Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...