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]沙拉公主的困惑的更多相关文章

  1. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  2. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  3. 九度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). ...

  4. The 2018 ACM-ICPC China JiangSu Provincial Programming Contest快速幂取模及求逆元

    题目来源 The 2018 ACM-ICPC China JiangSu Provincial Programming Contest 35.4% 1000ms 65536K Persona5 Per ...

  5. 二分求幂/快速幂取模运算——root(N,k)

    二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...

  6. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  7. UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)

      Carmichael Numbers  An important topic nowadays in computer science is cryptography. Some people e ...

  8. BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 6103  Solved: 2060[Submit][S ...

  9. 欧拉函数phic以及超大数的快速幂

    题目:求a^b*c%mod; 其中b<=10^100000; 是不是很大..... /*当你要计算 A^B%C的时候 因为此题中的B很大,达到10^100000,所以我们应该联想到降幂公式. 降 ...

随机推荐

  1. CentOS 7, Attempting to create directory /root/perl5

    By francis_hao    Apr 10,2017 在使用CentOS 7的时候,首次登陆会出现新建一个perl5文件夹的提示,删除该文件后,之后登陆还是会出现该提示并新建了perl5文件夹. ...

  2. node安装

    由于Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境. 安装Node.js 目前Node.js的最新版本是7.6.x.首先,从Node.js官网下载对应平台 ...

  3. 关于控制下拉框select只读的js控制

    文本框有readonly属性,直接设置:下拉框没有readonly属性,也不能通过其他属性进行只读的设置,下拉框只有disabled属性,但是这个属性设成true之后,值就获取不到了: 我在网上搜了一 ...

  4. 【BZOJ3624】【APIO2008】免费道路 [生成树][贪心]

    免费道路 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Input Output Sampl ...

  5. 1210笔记//关于导航实例-QQ空间//导航实例-storyboard实现//控制器的生命周期//控制器的生命周期方法

      一.利用storyboard完成导航1.storyboard中用来跳转的每一根线 都是 一个 UIStoryboardSegue对象1> 自动跳转 (从 某个按钮 拖线到 下一个目的控制器) ...

  6. 【洛谷 P4886】 快递员 (点分治)

    这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ...

  7. Opencv 学习笔记之——鼠标,进度条操作

    Opencv中提供一个鼠标调用的函数,SetMouseCallback()函数,它配合一个回调函数来实现鼠标操作的功能.   首先看一下SetMouseCallback的函数原型: c++: void ...

  8. 无线路由器中WMM/Short GI/AP隔离各是什么功能, 开启时PC无法ping通手机.

      无线路由器的WMM功能和开启ap隔离,以及开启ShortGI有什么用 无线路由器中有开启WMM.开启Short GI和开启AP隔离分别代表什么呢?这是我在我的TP-LINK无线路由器TL-WR84 ...

  9. 虚拟机vmware10.0.0里设置Suse Linux Enterprise 11系统静态IP上网

    http://blog.csdn.net/usbdrivers/article/details/50035615 首次在虚拟机里安装Suse Linux Enterprise 11,采用NET方式能够 ...

  10. 【hdoj_1009】FatMouse's Trade

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1009< 本题用到贪心策略和结构体排序. 问题简化:现有资本M,N个房间,第i个房间对应着价格为F[i ...