BZOJ2186 [Sdoi2008]沙拉公主的困惑 数论:递推求逆元
来源:互联网 发布:tmt行业 知乎 编辑:程序博客网 时间:2024/04/25 07:45
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2186
题目大意:求1到n!中与m!互素的数的个数。
分析:我们知道,1到m中与m互素的数的个数是Φ(m)个,如果有m|n,那么我们有:1到n中与m互素的数的个数为n/m*Φ(m)个。这样问题就变为了求n!* ∏(1-1/pi)。
实现代码如下:
#include <cstdio>#include <cstring>#include <bitset>using namespace std;typedef long long ll;const int maxn=10000005;int MOD;//bool prime[maxn];bitset <maxn> prime; //比定义bool类型要省时。换成bool果断TLE了ll fac[maxn]; //阶乘ll inv[maxn]; //逆元ll tmp[maxn]; //∏(1-1/pi)void Init(){ //打素数表 //memset(prime,true,sizeof(prime)); prime.set(); for(int i=2;i<maxn;i++) if(prime[i]) for(int j=i+i;j<maxn;j+=i) prime[j]=false; //打阶乘表 fac[0]=1; for(int i=1;i<maxn;i++) fac[i]=fac[i-1]*i%MOD; //打逆元表 inv[1]=1; for(int i=2;i<maxn;i++) { if(i>=MOD) break; inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD; } //计算∏(1-1/pi)%MOD tmp[1]=1; for(int i=2;i<maxn;i++) { if(prime[i]) { tmp[i]=tmp[i-1]*(i-1)%MOD; tmp[i]=tmp[i]*inv[i%MOD]%MOD; } else tmp[i]=tmp[i-1]; }}int main(){ int t,n,m; scanf("%d%d",&t,&MOD); Init(); while(t--) { scanf("%d%d",&n,&m); printf("%lld\n",fac[n]*tmp[m]%MOD); } return 0;}
0 0
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 数论:递推求逆元
- 【bzoj2186】【sdoi2008】【沙拉公主的困惑】【数论】
- bzoj2186: [Sdoi2008]沙拉公主的困惑 逆元
- bzoj2186【Sdoi2008】沙拉公主的困惑 数论:欧拉筛法,线性逆元
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
- 【SDOI2008】【BZOJ2186】【沙拉公主的困惑】【题解】【数论】
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑 数论 线性筛逆元
- [BZOJ2186][Sdoi2008]沙拉公主的困惑(数论)
- [bzoj2186][Sdoi2008]沙拉公主的困惑(数论)
- [BZOJ2186][SDOI2008]沙拉公主的困惑(数论)
- BZOJ2186: [Sdoi2008]沙拉公主的困惑
- bzoj2186: [Sdoi2008]沙拉公主的困惑
- bzoj2186【SDOI2008】沙拉公主的困惑
- 【SDOI2008】【BZOJ2186】沙拉公主的困惑
- [BZOJ2186][Sdoi2008]沙拉公主的困惑
- [Sdoi2008](bzoj2186)沙拉公主的困惑
- 【SDOI2008】【BZOJ2186】沙拉公主的困惑
- [BZOJ2186][Sdoi2008]沙拉公主的困惑
- TCP/IP 协议详解内容总结
- UVa 10827 - Maximum sum on a torus
- html常用标记
- 前端笔试
- oracle学习笔记(聚合函数以及group by 和having 的用法)
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 数论:递推求逆元
- 面试五种作死的行为
- 设计模式六大原则(1):单一职责原则
- URAL 1329 Galactic History (DFS)
- 面对对象思想3
- 《精益创业》读书笔记
- Java中finalize()用法
- iOS图形绘制方法汇总及图片处理
- 使用gdb进行调试入门篇