题目链接:https://www.luogu.org/problemnew/show/P2480

题目背景

“在那山的那边海的那边有一群小肥猪。他们活泼又聪明,他们调皮又灵敏。他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……”

——选自猪王国民歌

很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国。猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了。因此也很少有其他动物知道这样一个王国。

猪王国虽然不大,但是土地肥沃,屋舍俨然。如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了。猪王勤政爱民,猪民安居乐业,邻里和睦相处,国家秩序井然,经济欣欣向荣,社会和谐稳定。和谐的社会带给猪民们对工作火红的热情和对未来的粉色的憧憬。

小猪iPig是猪王国的一个很普通的公民。小猪今年10岁了,在大肥猪学校上小学三年级。和大多数猪一样,他不是很聪明,因此经常遇到很多或者稀奇古怪或者旁人看来轻而易举的事情令他大伤脑筋。小猪后来参加了全猪信息学奥林匹克竞赛(Pig Olympiad in Informatics, POI),取得了不错的名次,最终保送进入了猪王国大学(Pig Kingdom University, PKU)深造。

现在的小猪已经能用计算机解决简单的问题了,比如能用P++语言编写程序计算出A + B的值。这个“成就”已经成为了他津津乐道的话题。当然,不明真相的同学们也开始对他刮目相看啦~

小猪的故事就将从此展开,伴随大家两天时间,希望大家能够喜欢小猪。

题目描述

猪王国的文明源远流长,博大精深。

iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N。当然,一种语言如果字数很多,字典也相应会很大。当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力、物力将难以估量。故考虑再三没有进行这一项劳猪伤财之举。当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字。

iPig打算研究古时某个朝代的猪文文字。根据相关文献记载,那个朝代流传的猪文文字恰好为远古时期的k分之一,其中k是N的一个正约数(可以是1和N)。不过具体是哪k分之一,以及k是多少,由于历史过于久远,已经无从考证了。

iPig觉得只要符合文献,每一种能整除N的k都是有可能的。他打算考虑到所有可能的k。显然当k等于某个定值时,该朝的猪文文字个数为N / k。然而从N个文字中保留下N / k个的情况也是相当多的。iPig预计,如果所有可能的k的所有情况数加起来为P的话,那么他研究古代文字的代价将会是G的P次方。

现在他想知道猪王国研究古代文字的代价是多少。由于iPig觉得这个数字可能是天文数字,所以你只需要告诉他答案除以999911659的余数就可以了。

输入输出格式

输入格式:

输入文件ancient.in有且仅有一行:两个数N、G,用一个空格分开。

输出格式:

输出文件ancient.out有且仅有一行:一个数,表示答案除以999911659的余数。

输入输出样例

输入样例#1:

4 2
输出样例#1:

2048

说明

数据规模

10%的数据中,1 <= N <= 50;

20%的数据中,1 <= N <= 1000;

40%的数据中,1 <= N <= 100000;

100%的数据中,1 <= G <= 1000000000,1 <= N <= 1000000000。

题目大意:给定n,g,计算$g^{\sum_{d|n}\dbinom{n}{d}}$%999911659的值

首先暴力算法肯定是不可以的,必须对式子进行一定的处理,由于999911659是一个质数,考虑使用欧拉定理。

那么我们最主要的就是快速的算出$\sum_{d|n}\dbinom{n}{d}$%999911658的值

显然,999911658这个数字大了,我们没有办法直接枚举d然后卢卡斯定理。这个时候我们选择将999911658质因数分解,999911658=2*3*4679*35617,分别将它的每个因数作为卢卡斯定理过程中的模,我们设得到的值分别是a1,a2,a3,a4,上述四个质因数分别是m1,m2,m3,m4,$x=\sum_{d|n}\dbinom{n}{d}$

于是我们有

x ≡ a1 (mod m1)

x ≡ a2 (mod m2)

x ≡ a3 (mod m3)

x ≡ a4 (mod m4)

那么直接中国剩余定理计算出x的最小值就好了

接下来快速幂计算gx mod 999911659即可

下面附上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; const int mod=;
const int MOD=;
int n,g;
int prime[]={,,,};
int ans[],fac[];
int mul(ll a,int b,int p)
{
int r=;
for (;b;b>>=,a=(a+a)%p) if (b&) r=(r+a)%p;
return r;
}
int qpow(ll a,int b,int p)
{
int r=;
for (;b;b>>=,a=a*a%p) if (b&) r=r*a%p;
return r;
}
int inv(int x,int p)
{
return qpow(x,p-,p)%p;
}
int C(int n,int m,int p)
{
if (m==||m==n) return ;
if (m>n) return ;
return fac[n]*inv(fac[n-m]*fac[m],p)%p;
}
int lucas(int n,int m,int p)//卢卡斯定理
{
if (m==||m==n) return ;
if (m>n) return ;
return lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
int crt()//中国剩余定理
{
int r=;
for (int i=;i<;i++)
{
int tmp=MOD/prime[i];
r=(r+1ll*ans[i]*tmp%MOD*qpow(tmp,prime[i]-,prime[i])%MOD)%MOD;
}
return r;
}
int main()
{
scanf("%d%d",&n,&g);
if (g==mod)//特判欧拉定理不成立的情况
{
puts("");
return ;
}
for (int i=;i<;i++)
{
fac[]=;
for (int j=;j<=prime[i];j++)
fac[j]=fac[j-]*j%prime[i];
for (int k=;k*k<=n;k++)//枚举约数
if (n%k==)
{
ans[i]=(ans[i]+lucas(n,k,prime[i]))%prime[i];
if (k*k!=n) ans[i]=(ans[i]+lucas(n,n/k,prime[i]))%prime[i];
}
//printf("%d\n",ans[i]);
}
printf("%d",qpow(g,crt(),mod));
return ;
}

[SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告的更多相关文章

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

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

  2. 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理

    [bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...

  3. 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 ...

  4. 1951: [Sdoi2010]古代猪文

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

  5. [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)

    [SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...

  6. 洛谷 P2480 [SDOI2010]古代猪文 解题报告

    P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...

  7. 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理

    P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...

  8. 洛咕 P2480 [SDOI2010]古代猪文

    洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...

  9. 【BZOJ1951】[SDOI2010]古代猪文

    [BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...

随机推荐

  1. [Angular] Provide Feedback to Progress Events with Angular’s HttpRequest Object

    In some cases your application might need to upload large amounts of data, such as files. Obviously ...

  2. Microsoft Updateclient更新

     大家好, 微软Microsoft Update产品组官方博客于昨天宣布了有关最新的Windows Updateclient更新的消息.依据这则博客.微软从当日開始逐渐向全部Windows 7, ...

  3. ThinkPHP5.0框架开发--第1章 Tp5.0安装

    ThinkPHP5.0框架开发--第1章 Tp5.0安装 第1章 Tp5.0 安装 ======================================================== 今 ...

  4. oracle 11g RAC 的一些基本概念

    一.脑裂以及对策 脑裂(split-brain)是集群中的一个糟糕的情况:集群中的所有集群正在工作的时候,内部通讯被断开.这种情况下,集群被分成了几个部分,每个部分的集群软件都会尝试去接管其他节点的资 ...

  5. JavaScript 基础 if switch 弹窗 运算符

    脚本语言最重要的几个部分: 数据类型 运算符 控制语句 数组  方法(函数) 一.基础知识 关键字:系统定义 有意义的名字如 background link 等 标识符:自己定 比如class的名字a ...

  6. css3 字体、2D转换、3D转换

    学习篇之CSS3 字体.2D转换.3D转换 一.字体 @font-face 将字体文件存放到 web 服务器上,通过CSS3 @font-face规则中定义,它会在需要时被自动下载到用户的计算机上. ...

  7. direct2d: antialiasing and drawing a line with a 1 pixel stroke

    http://xboxforums.create.msdn.com/forums/t/61448.aspx I'm currently porting a number of custom MFC C ...

  8. 【原创】Unable to read TLD "META-INF/c.tld" from JAR file 解决方法

    type Exception report message description The server encountered an internal error () that prevented ...

  9. oracle动态磁盘管理

    一.ASM发展: oracle 想做硬件: 收购sum公司的小型机业务 推出一体机Exadata 1.sum服务器 2.磁盘柜(没做存储) 推出asm建库方式配合一体机(自动使用磁盘柜的盘)(抛弃ra ...

  10. swift where 的作用

    条件限定: 类型限定: 结构化查询模式. 用于结构体.记录字段.