【bzoj2186】沙拉公主的困惑 欧拉函数+乘法逆元
2016-11-21 13:06
411 查看
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2186
【题解】
显然题目是求phi(m!) * ( n! / m!)phi (m!) = m! * (p-1)/p p是m!的质因数
整理得 求 n! * (p-1)/p p是m!的质因数,即
预处理1-10000000的素数以及1-10000000的逆元。。。
都可以线性筛。。事实上只要把素数的逆元用exgcd求一求就好,其余并未用到
阶乘取模也预处理一下
——转自hzwer
这个题解写的很好,我也没什么可说的了。
最后吐槽一下:出题人丧心病狂,先卡空间,后卡时间。
所以千万不要用全局long long,后果如下:
RunID | User | Problem | Result | Memory | Time | Language | Code_Length | Submit_Time |
1690284 | songyiqun | 2186 | Accepted | 130196 kb | 6424 ms | C++/Edit | 1369 B | 2016-11-04 11:02:50 |
1690280 | songyiqun | 2186 | Time_Limit_Exceed | 130196 kb | 11788 ms | C++/Edit | 1362 B | 2016-11-04 10:57:08 |
1690274 | songyiqun | 2186 | Time_Limit_Exceed | 130196 kb | 11780 ms | C++/Edit | 1364 B | 2016-11-04 10:54:02 |
1690271 | songyiqun | 2186 | Time_Limit_Exceed | 130200 kb | 11776 ms | C++/Edit | 1380 B | 2016-11-04 10:52:34 |
1690264 | songyiqun | 2186 | Time_Limit_Exceed | 249340 kb | 11096 ms | C++/Edit | 1439 B | 2016-11-04 10:48:43 |
1690253 | songyiqun | 2186 | Time_Limit_Exceed | 249340 kb | 11576 ms | C++/Edit | 1386 B | 2016-11-04 10:37:04 |
1690246 | songyiqun | 2186 | Time_Limit_Exceed | 249340 kb | 11576 ms | C++/Edit | 1386 B | 2016-11-04 10:35:04 |
1690241 | songyiqun | 2186 | Time_Limit_Exceed | 249340 kb | 11624 ms | C++/Edit | 1361 B | 2016-11-04 10:26:29 |
1690240 | songyiqun | 2186 | Memory_Limit_Exceed | 391772 kb | 0 ms | C++/Edit | 1350 B | 2016-11-04 10:25:49 |
1690237 | songyiqun | 2186 | Memory_Limit_Exceed | 391772 kb | 0 ms | C++/Edit | 1350 B | 2016-11-04 10:23:07 |
/************* bzoj 2186 by chty 2016.11.4 *************/ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> using namespace std; #define MAXN 10000000 int n,m,T,mod,cnt,prime[500010],ans[MAXN+10],fac[MAXN+10],ni[MAXN+10]; bool check[MAXN+10]; inline int read() { int x=0; char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } void exgcd(int a,int b,int &x,int &y) { if(!b) {x=1; y=0; return;} exgcd(b,a%b,x,y); int t=x;x=y;y=t-a/b*y; } int find(int p) { int x,y; exgcd(p,mod,x,y); x=(x%mod+mod)%mod; return x; } void pre() { fac[1]=1; ni[1]=1; for(int i=2;i<=MAXN;i++) fac[i]=(long long)fac[i-1]*i%mod; for(int i=2;i<=MAXN;i++) { if(!check[i]) prime[++cnt]=i,ni[i]=find(i); for(int j=1;j<=cnt&&prime[j]*i<=MAXN;j++) { check[prime[j]*i]=1; if(i%prime[j]==0) break; } } ans[1]=1; for(int i=2;i<=MAXN;i++) { ans[i]=ans[i-1]; if(!check[i]) ans[i]=(long long)ans[i]*(i-1)%mod*ni[i]%mod; } } int main() { T=read(); mod=read(); pre(); while(T--) { n=read(); m=read(); printf("%d\n",(long long)fac *ans[m]%mod); } return 0; }
相关文章推荐
- 【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑
- Bzoj2186:[Sdoi2008]沙拉公主的困惑:欧拉函数+乘法逆元
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
- BZOJ 2186: [Sdoi2008]沙拉公主的困惑 [欧拉函数][逆元]
- 【bzoj2186】[Sdoi2008]沙拉公主的困惑 欧拉函数
- BZOJ 2186 沙拉公主的困惑 逆元+素数筛+欧拉函数
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
- 2186: [Sdoi2008]沙拉公主的困惑 线性筛素数+欧拉函数+乘法逆元
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
- [BZOJ2186][SDOI2008]沙拉公主的困惑 欧拉函数
- [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)
- BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数
- BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
- [BZOJ 2186][Sdoi2008]沙拉公主的困惑:欧拉函数
- bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
- [bzoj2186]沙拉公主的困惑 欧拉函数+逆元
- bzoj 2186 [Sdoi2008]沙拉公主的困惑(欧拉函数,逆元)
- [BZOJ 2186] [Sdoi2008] 沙拉公主的困惑 【欧拉函数】