BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8109156.html
题目传送门 - BZOJ1951
题意概括
求 GM mod 999911659
M=∑i|nC(n,i)
N,G<=109
题解
我们发现999911659是一个素数,设为p。
费马小定理:对于任意正整数a,和素数p,有
ap-1 Ξ 1 (mod p)
由此可得, GM Ξ GM mod (p-1) (mod p)
这个可以用快速幂搞定,现在的问题就是如何计算M
我们研究p-1这个数。
我们把他分解质因数:
p-1 = 999911658 = 2 × 3 × 4679 × 35617
我们发现他们都很小。而且没有质数的多次方之类的(不然貌似要用到ex_lucas)
我们于是分组解决这个问题。
对于模数为2、3、4679、35617我们分别求解。
设当前的模数为p,那么,我们只需要枚举i(i|n),可以在
的复杂度里面得到所有的i,那么现在我们考虑计算C(n,i)。
显然,这个可以套Lucas定理:(设p为当前的素模数)
C(n,m) Ξ C(n mod p,m mod p) × C(n div p,m div p) (mod p)
于是我们可以将n和m的规模在log的复杂度内搞到p以下。然后直接套C函数的公式就可以了(提前预处理出阶乘)。
那么,我们得到了4个答案。
然后我们考虑结合4个答案。
记我们的答案分别为a[0]、a[1]、a[2]、a[3];而之前的四个数为p[0]~p[4]。
我们发现,我们得到的4个答案可以写出等式:
a[i] Ξ M (mod p[i]) (0<=i<4)
这个很明显就是中国剩余定理(CRT)可以搞定的。
而且p[i]都是质数,两两互质,那么就更好办了。
注意,开始的时候要把G=999911659的情况判掉,不然会出错。
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
LL mod=999911659;
LL num[4]={2,3,4679,35617};
LL N,G,M,a[4];
LL Pow(LL x,LL y,LL mod){
if (!y)
return 1LL;
LL xx=Pow(x,y/2,mod);
xx=xx*xx%mod;
if (y&1LL)
xx=xx*x%mod;
return xx;
}
LL Inv(LL x,LL mod){
return Pow(x,mod-2,mod);
}
LL fac[4][36000],inv[4][36000];
void Get_fac(){
for (LL x=0;x<4;x++){
fac[x][0]=1;
for (LL i=1;i<num[x];i++)
fac[x][i]=fac[x][i-1]*i%num[x];
}
for (LL x=0;x<4;x++)
for (LL i=0;i<num[x];i++)
inv[x][i]=Inv(fac[x][i],num[x]);
}
LL _C(int i,LL N,LL M){
if (N<M)
return 0;
return fac[i][N]*inv[i][M]%num[i]*inv[i][N-M]%num[i];
}
LL C(int i,LL N,LL M){
if (M==0)
return 1LL;
return _C(i,N%num[i],M%num[i])*C(i,N/num[i],M/num[i])%num[i];
}
void ex_gcd(LL a,LL b,LL &x,LL &y){
if (b==0){
x=1,y=0;
return;
}
ex_gcd(b,a%b,y,x);
y-=(a/b)*x;
}
LL CRT(){
LL x,y,A=num[0],B=a[0];
for (int i=1;i<4;i++){
LL A1=num[i],B1=a[i];
ex_gcd(A,A1,x,y);
x=((B1-B)*x%A1+A1)%A1;
B+=A*x;
A*=A1;
}
return B;
}
int main(){
scanf("%lld%lld",&N,&G);
if (G==mod){
puts("0");
return 0;
}
Get_fac();
for (LL x=0;x<4;x++)
for (LL i=1;i<=(LL)sqrt(N);i++)
if (N%i==0){
int A=i,B=N/i;
if (A!=B)
a[x]=(a[x]+C(x,N,A)+C(x,N,B))%num[x];
else
a[x]=(a[x]+C(x,N,i))%num[x];
}
LL res=CRT();
printf("%lld",Pow(G,res,mod));
return 0;
}
BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论的更多相关文章
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...
- BZOJ1951[SDOI2010]古代猪文
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- BZOJ1951:[SDOI2010]古代猪文(Lucas,CRT)
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- bzoj千题计划323:bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)
https://www.lydsy.com/JudgeOnline/problem.php?id=1951 先欧拉降幂 然后模数质因数分解 分别计算组合数的结果,中国剩余定理合并 #include&l ...
- bzoj1951 [Sdoi2010]古代猪文 ——数论综合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 题意就是要求 G^( ∑(k|n) C(n,k) ) % p,用费马小定理处理指数,卢 ...
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- 【BZOJ1951】[SDOI2010]古代猪文
[BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...
随机推荐
- ubuntu 问题
1.打开ubuntu之后的开启页面出现:所选模式均不匹配可能的模式:为 CRTC 63 尝试模式CRTC 63:尝试 800x600@60Hz 模式输出在 1366x768@60Hz (通过 0)CR ...
- 【原创】Java基础之简单修改jar包中的class
有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是: 1 进入lib目录 # cd lib # ls test.jar ...
- liux三剑客grep 正则匹配
001正则匹配(大部分需要转义) ‘^‘: 锚定行首 '$' : 锚定行尾 [0-9] 一个数字 [^0-9] 除去数字所有,^出现在[]这里表示取反 [a-z] [A-Z] [a-Z] \s 匹配空 ...
- Swift 学习- 09 -- 枚举
// 递归枚举 // 美家居为一组相关的值定义了一个共同的类型, 使你可以在代码中以类型安全的的方式使用这些值. // 如果你熟悉C语言, 你会知道在C语言中, 枚举会为一组整型值分配相关联的名称, ...
- Confluence 6 找到在创建 XML 备份的时候出现的错误
错误可能是因为数据库突然不可访问而产生.如果你在你的日志中看到了错误 'Couldn't backup database data' ,这个指南将会帮助你更正这个错误.我们强烈推荐你备份 Confl ...
- Confluence 6 数据库整合的方法 1:基本流程
步骤 1:对你的插件进行记录 对你近期在 Confluence 中安装和启用的插件进行记录,这你可以在后期对插件进行重新安装或者调整.针对你安装的插件,你需要记录下面的一些内容: 插件名称 版本号 启 ...
- (七)STL适配器
1.适配器是稍微修改某些功能,比如三个参数改为两个参数,函数的名称改一下等等,可以出现在容器.迭代器和仿函数中. 2.适配器相当于对某个东西进行封装,例如A是B的适配器,则真正的功能实现是在B中,可以 ...
- Java编程的分期步骤(一)
日期:2018.8.12 星期一 博客期:005 不知不觉来到第五期了,先简单说一下Java环境!(虽然Java都自学完了才说....)首先,就是在网站上下载一个java包,之后把它下载到全英文的一个 ...
- python网络爬虫笔记(四)
一.python中的高阶函数算法 1.sorted()函数的排序 sorted()函数是一个高阶函数,还可以接受一个key函数来实现自定义的函数排序,key指定的函数作用于每个序列元素上,并根据k ...
- 使用Eclipse、Tomcat遇到的一些问题
Tomcat服务无法启动 前两天瞎搞,试着弄了弄Android的环境.结果不知道动了什么地方,Tomcat崩了,本地打开localhost:8080一直显示404,eclipse也无法使用Tomcat ...