博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 1951] 古代猪文
阅读量:5099 次
发布时间:2019-06-13

本文共 1801 字,大约阅读时间需要 6 分钟。

Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1951

 

Solution:

见过最长的数论题题面.......

 

一道数论的综合题,求解:

\[g^{\sum_{d|n} C_n^d}~mod~p\]

 

我们先看幂能否化简,

由费马小定理可知

\begin{aligned} \displaystyle ans &=  g^{\sum_{d|n} C_n^d}~mod~p  \\  &=g^{\sum_{d|n} C_n^d~mod~(p-1)}~mod~p  \end{aligned}

 

对于化简后的幂:

\[\sum_{d|n} C_n^d~mod~(p-1)\]

我们想到枚举每一个n的约数,使用Lucas定理求大组合数取模

 

但P-1=2*3*4679*35617,不是一个质数

于是我们以每一个质因子为模数算出最终的解

由于质因子之间是互质的,再用中华剩余定理合并结果算出最小的\[\sum_{d|n} C_n^d\],即为\[\sum_{d|n} C_n^d~mod~(p-1)\]

 

Code:

#include 
using namespace std;typedef long long ll;const int MAXN=1e5+10;const int MOD=999911659;int quick_pow(ll a,ll b,int p) //快速幂{ ll ret=1;a%=p; while(b) { if(b&1) ret=ret*a%p; b>>=1;a=a*a%p; } return ret; } int inv(ll a,int p){return quick_pow(a,p-2,p);} //求逆元 int g,n,fac[4][MAXN],c[4]; int pri[]={2,3,4679,35617}; int C(int n,int m,int p) //求组合数 { if(n>m) return 0; return 1ll*fac[p][m]*inv(1ll*fac[p][n]*fac[p][m-n],pri[p])%pri[p]; } int Lucas(int n,int m,int p) //Lucas定理 { if(m==0) return 1; return C(n%pri[p],m%pri[p],p)*Lucas(n/pri[p],m/pri[p],p)%pri[p]; } ll CRT() //中国剩余定理 { ll ret=0,p=MOD-1; for(int i=0;i<4;i++) ret=(ret+1ll*p/pri[i]*inv(p/pri[i],pri[i])*c[i])%p; return ret%MOD; } int main() { cin >> n >> g; if(g==MOD) return cout << 0,0; for(int i=0;i<4;i++) //预处理阶乘 { fac[i][0]=1; for(int j=1;j<=pri[i];j++) fac[i][j]=fac[i][j-1]*j%pri[i]; } for(int i=0;i<4;i++) for(int j=1;j*j<=n;j++) if(n%j==0) { c[i]=(c[i]+Lucas(j,n,i))%pri[i]; if(j*j!=n) c[i]=(c[i]+Lucas(n/j,n,i))%pri[i]; } cout << quick_pow(g,CRT(),MOD); return 0; }

 

Review:

1、如果模数为质数,

利用费马小定理对幂化简

 

2、遇到大组合数取模  ------->   Lucas定理

 

如果模数不为质数,质因数分解后分别求出结果再用中华剩余定理合并,套路啊……

 

3、中华剩余定理求解方法

(1)递推式地两两求解

(2)根据推导出的结论直接求解:

\[x=(\sum\limits_{i=1}^k c_i*{M\over m_i}*inv({M\over m_i},mi))\%M\]

转载于:https://www.cnblogs.com/newera/p/9088919.html

你可能感兴趣的文章
hdu 1599 find the mincost route(无向图的最小环)
查看>>
转载:解读CSS布局之-水平垂直居中(2)
查看>>
第十八章 30限制数组越界
查看>>
浅谈unique列上插入重复值的MySQL解决方案
查看>>
hdu 4859(思路题)
查看>>
11.2.0.4 sql*loader/oci direct load导致kpodplck wait before retrying ORA-54
查看>>
sql server 2008空间释放
查看>>
团队-科学计算器-最终总结
查看>>
树的遍历 TJUACM 3988 Password
查看>>
UVA 725 - Division
查看>>
bzoj1798: [Ahoi2009]Seq 维护序列seq(线段树)
查看>>
窗体中拖动panel,并且不会拖动至窗体外部程序实现方法。
查看>>
vb中从域名得到IP及从IP得到域名
查看>>
一步步跨过学习中一道道的坎
查看>>
妙味——操作元素属性的几种方法
查看>>
Ring 0 Inline Hook
查看>>
Linux man C++ 库函数
查看>>
PE结构对照表
查看>>
复杂性渐近阶的重要性
查看>>
js数组创建两种方法
查看>>