【题目链接】

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

【思路】

一道优(e)秀(xin)的数论题。

首先我们要求的是(G^sigma{ C(n,n/i),i|n })%P,即G^M %P,根据费马小定理G^(P-1) ≡1(mod P),我们要求的就是G^(M%(P-1)) %P。

考虑C(n,i)%(P-1),由于n i P都比较大所以不好求组合数。发现P-1可以分解质因数为2,3,4679,35617,将C(n,i)对每一个质因子取模,会得到一个形为x≡ ai(mod pi)的模线性方程组,可以用中国剩余定理确定x。对于C(n,i)%p,此时p比较小,我们可以用lucas定理求解。

总的来说就是先用O(sqrt(n))的时间枚举约数,然后用lucas定理求出不同模数下的ai,最后联立方程组,中国剩余定理解。

注意当(G,P)!=1的时候费马小定理不成立,此时答案为0。

关于lucas的写法,a^p-2 %p是a在模p下的逆,因为a^(p-2) *a=a^(p-1),由费马小定理得a^(p-1) %p=1,因此p必须满足为质数才能使用这种方法。

【定理】

1—  欧拉定理

当a与p互质时,a^phi(p) mod p=1

费马小定理即欧拉定理在p为质数时的特例, a(p-1)  ≡1 mod p

2—  Lucas定理

C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)

【代码】

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; typedef long long LL;
const int N = ;
const LL mod[]={,,,,}; LL fac[][N],a[],n,G; void gcd(LL a,LL b,LL &x,LL& y) {
if(!b) { x=;y=; }
else gcd(b,a%b,y,x) , y-=x*(a/b);
}
LL pow(LL x,LL p,LL MOD) {
LL ans=;
while(p) {
if(p&) ans=(ans*x)%MOD;
x=(x*x)%MOD; p>>=;
}
return ans;
}
LL C(LL n,LL m,int x) {
if(n<m) return ;
return (fac[x][n]*pow(fac[x][n-m]*fac[x][m],mod[x]-,mod[x]))%mod[x];
}
LL lucas(LL n,LL m,int x) {
if(!m) return ;
return lucas(n/mod[x],m/mod[x],x)*C(n%mod[x],m%mod[x],x)%mod[x];
}
LL china() {
LL M=,d,x,y,ans=;
for(int i=;i<;i++) M*=mod[i];
for(int i=;i<;i++) {
d=M/mod[i];
gcd(d,mod[i],x,y);
ans=(ans+d*x*a[i])%M;
}
while(ans<=) ans+=M;
ans=(ans+M)%M;
return ans;
}
void get_fac() {
for(int i=;i<;i++) {
fac[i][]=;
for(int j=;j<=mod[i];j++)
fac[i][j]=(fac[i][j-]*j)%mod[i];
}
}
int main() {
get_fac();
scanf("%lld%lld",&n,&G);
G%=mod[];
if(!G) { puts(""); return ; }
for(int i=;i*i<=n;i++) if(n%i==) {
LL tmp=n/i;
for(int j=;j<;j++) {
a[j]=(a[j]+lucas(n,tmp,j))%mod[j];
if(tmp!=i) a[j]=(a[j]+lucas(n,i,j))%mod[j];
}
}
printf("%lld",pow(G,china(),mod[])); return ;
}

bzoj 1951 [Sdoi2010]古代猪文(数论知识)的更多相关文章

  1. BZOJ 1951: [Sdoi2010]古代猪文( 数论 )

    显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...

  2. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

  3. 【刷题】BZOJ 1951 [Sdoi2010]古代猪文

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  4. bzoj 1951 [Sdoi2010]古代猪文 ——数学综合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 数学综合题. 费马小定理得指数可以%999911658,又发现这个数可以质因数分解.所 ...

  5. bzoj 1951: [Sdoi2010]古代猪文

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #defin ...

  6. BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)

    题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...

  7. bzoj 1951: [Sdoi2010]古代猪文 【中国剩余定理+欧拉定理+组合数学+卢卡斯定理】

    首先化简,题目要求的是 \[ G^{\sum_{i|n}C_{n}^{i}}\%p \] 对于乘方形式快速幂就行了,因为p是质数,所以可以用欧拉定理 \[ G^{\sum_{i|n}C_{n}^{i} ...

  8. BZOJ 1951 [SDOI2010]古代猪文 (组合数学+欧拉降幂+中国剩余定理)

    题目大意:求$G^{\sum_{m|n} C_{n}^{m}}\;mod\;999911659\;$的值$(n,g<=10^{9})$ 并没有想到欧拉定理.. 999911659是一个质数,所以 ...

  9. BZOJ 1951: [Sdoi2010]古代猪文 ExCRT+欧拉定理+Lucas

    欧拉定理不要忘记!! #include <bits/stdc++.h> #define N 100000 #define ll long long #define ull unsigned ...

随机推荐

  1. PHP学习笔记(3) - 奇怪的class与autoload

    PHP的class与其他语言有很多不同点.PHP允许很奇葩的在静态方法中调用实例方法,提供了关键字self和static用于访问类自身的静态成员.self永远是指当前的类,而static则可能会变成指 ...

  2. php curl request

    /** * @desc curl request请求 * @date 2016-12-07 16:26:55 * * @param $arguments * * @return bool|mixed ...

  3. Linux硬链接和符号链接(转)

    Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]  硬连接指通过索引节点来进行连接.在Li ...

  4. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  5. hdu 5510 Bazinga KMP+尺取法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意:至多50组数据,每组数据至多500个字符串,每个字符串的长度最长为2000.问最大的下标( ...

  6. 2、分布式文件系统---HDFS

    1.HDFS设计前提与目标 (1)硬件错误是常态而不是异常.  错误检测并快速自动恢复是HDFS最核心设计目标 (2)流式数据访问.运行在HDFS上的应用主要是以流式数据读取为主,做批量处理而不是用户 ...

  7. 【产品体验】eyepetizer开眼

    第一次写博客,内心还有点小激动呢~~本人产品新人,学习中,希望大家多多指教!  先来两张开眼的界面图坐镇——         开眼简介: appetizer for eyes 即 eyepetizer ...

  8. Struts2 interceptor使用经验小结

    1. interceptor 调用Spring容器中的bean 在interceptor中常有需要调用Spring Bean的需要,其实很简单和Struts2的Action一样配置即可. Spring ...

  9. Ubuntu 14.04数据库服务器--mysql的安装和配置

    mysql是Oracle公司的一种开放源代码的关系型数据库管理系统,被广泛应用于各中小网站,是一种跨平台的数据库管理系统,现在介绍一下如何在Ubuntu 14.04上安装和配置mysql 1. 更新源 ...

  10. eclipse+tomcat7解决项目中文乱码的一个思路

    1. 在代码层面进行编码的修改操作,参考博文的方法一:http://www.cnblogs.com/longshiyVip/p/4873058.html 2. 如果项目使用了struts2等前端框架, ...