【题解】古代猪文 [SDOI2010] [BZOJ1951] [P2480]


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


【题目描述】

\((\)仅供观赏\()\)

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

\(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\)的余数就可以了。

【真正的题目描述(人话)】

给定 \(n\) 和 \(G\) \(,\) 求 \(:\) \(G^{\sum_{d|n}C_n^d}\bmod 999911659\)

【数据规模】

\(10\%\) \(1 \leqslant N \leqslant 50\)

\(20\%\) \(1 \leqslant N \leqslant 1000\)

\(40\%\) \(1 \leqslant N \leqslant 100000\)

\(100\%\) \(1 \leqslant N \leqslant 1000000000,1 \leqslant G \leqslant 1000000000\)


【分析】

看到上面这个式子,很容易想到暴力解法:枚举 \(n\) 的所有正约数 \(d\),分别求出 \(C_n^d\) 并累加答案,最后对 \(999911659\) 取模,如果你的目的不是 \(pian\) \(fen\) 而是 \(AC\),并且甘愿屈服于 \(TLE\),\(MLE\),\(RE\) 的统治,那么就大胆的去尝试吧!

【正解】

\(【Key\) \(1】\):欧拉定理的推论

(什么?你说你不知道欧拉定理?(O__O "…))

公式:\(a^b \equiv a^{b\bmod \varphi(P)}(\bmod P)\) \(,\) \(gcd(a,P)=1\)

在本题中 \(P=999911659\) 是一个质数(不要问我是怎么知道的),所以对任意 \(a\) 均满足 \(gcd(a,P)=1\),且有 \(\varphi(P)=P-1\)。

根据公式可得 \(G^{\sum_{d|n} C_n^d}=G^{\sum_{d|n}C_n^d\bmod 999911658}(\bmod 999911659)\)

因此本题关键是计算 \(\sum_{d|n}C_n^d\bmod 999911658\)

\(【Key\) \(2】\): \(Lucas\) 定理

公式: \(C_n^m=C_{n\bmod P}^{m\bmod P}*C_{n/P}^{m/P}(\bmod P)\)

求组合数并要求取模,一看就知道要用 \(Lucas\) 定理,这里不多说。

但是......

模数不为质数并且数据规模简直无敌,仍然会被 \(TLE,MLE,RE\)摁在地上摩擦。

于是我们需要将这个大巨无霸问题分解成小蒟蒻问题。

\(【Key\) \(3】\):\(Square\) \(Free\) \(Number\)

对 \(999911658\) 分解质因数,得到 \(999911658=2*3*4679*35617\) ,它的所有质因子的指数都为 \(1\) ,这一类数被称作 \(Square\) \(Free\) \(Number\) 。

\(Q:\) 这样做有什么用呢?

\(A:\) 马上就会提到。。。

\(【Key\) \(4】\):\(CRT(\)中国剩余定理\()\)

首先用 \(Lucas\) 定理分别求出 \(\sum_{d|n}C_n^d\) 对 \(2,3,4679,35617\) 这四个质数取模后的值,记为 \(a_1,a_2,a_3,a_4\) ,然后用中国剩余定理解一个线性同余方程组:

\(\begin{cases}x\bmod 2=a_1\\x\bmod 3=a_2\\x\bmod 4679=a_3\\x\bmod 35617=a_4\end{cases}\)

于是我们就得到了 \(\sum_{d|n}C_n^d\bmod 999911658\) 的一个最小非负整数解 \(x\),最后再用一次快速幂计算 \(G^x\)就是答案。

\(【Code】\)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize(2)
#include<cstdio>
#define LL long long
#define Re register LL
const int PP=35617,P=999911658;
LL x,y,i,j,n,G,fu,ans,a[5],jc[PP+3]={1},mod[5]={0,2,3,4679,35617};char c;
inline void in(Re &x){//【快读】自己动手,丰衣足食
fu=x=0;c=getchar();
while(c<'0'||c>'9')fu|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=fu?-x:x;
}
inline LL mi(Re x,Re k,Re P){//【快速幂】如果你非要写龟速乘我也拦不住你
Re s=1;
while(k){
if(k&1)(s*=x)%=P;
(x*=x)%=P,k>>=1;
}
return s;
}
inline LL Lucas(Re m,Re n,Re p){//【Lucas定理】
if(n<m)return 0;
if(n<p)return jc[n]*mi(jc[m],p-2,p)%p*mi(jc[n-m],p-2,p)%p;
return Lucas(m/p,n/p,p)*Lucas(m%p,n%p,p)%p;
}
inline void init(Re P){for(Re i=1;i<=P;++i)jc[i]=jc[i-1]*i%P;}//【预处理阶乘】
//对于四个模数都要预处理出不同的阶乘
inline void exgcd(Re &x,Re &y,Re a,Re b){//【扩欧】解线性同余方程
if(!b){x=1,y=0;return;}
exgcd(x,y,b,a%b);Re X=x;
x=y,y=X-a/b*y;
}
int main(){
in(n),in(G);
if(G%(P+1)==0){printf("0");return 0;}//如果定义P=999911658,注意这里要加 1
//当 G 为 999911659 的倍数时,直接特判结束
for(i=1;i<=4;++i){//【分解质因数】
init(mod[i]);//【初始化阶乘】
for(j=1;j*j<n;++j)
if(n%j==0)(((a[i]+=Lucas(j,n,mod[i]))%=mod[i])+=Lucas(n/j,n,mod[i]))%=mod[i];
//累加组合数并取模
if(j*j==n)(a[i]+=Lucas(j,n,mod[i]))%=mod[i];
}
for(i=1;i<=4;++i){//【中国剩余定理】跑一遍 CRT 解方程组
Re M=P/mod[i];exgcd(x,y,M,mod[i]);
(x+=mod[i])%=mod[i];(ans+=M*x%P*a[i]%P)%=P;
}
printf("%lld",mi(G,(ans+P)%P,P+1));//加 1.....
}

【题外话】

善良无比的 わたし 提供了本题的测试数据(98u9)哦\(QAQ\)


【题解】古代猪文 [SDOI2010] [BZOJ1951] [P2480]的更多相关文章

  1. 「SDOI2010」古代猪文(bzoj1951)

    题目写了一大堆背景. 一句话题意就是求 $q^{\sum_{d|n}C_{n}^{d}} \mod 999911659$. 因为$n$是质数,只有当$q$是$n$的倍数时(此题数据范围原因,最多$q= ...

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

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

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

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

  4. 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT

    [BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...

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

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

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

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

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

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

  8. P2480 [SDOI2010]古代猪文

    P2480 [SDOI2010]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...

  9. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)

    数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...

随机推荐

  1. wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.”

    当你安装完成wamp后,打开localhost或ip时发现已经可以运行了 但想使用phpmyadmin时,发现提示如下内容: You don't have permission to access / ...

  2. httpclient解析

    1.HttpClient简介 HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送Http请求变得容易,而且也方便开发人员测试接口(基于Http ...

  3. C# Net 合并int集合为字符串,如:输入1,2,3,4,8 输出1~4,8

    C# Net 合并int集合为字符串,如:输入1,2,3,4,8 输出1~4,8 粘贴代码使用: /// <summary> /// 合并int集合,如1,2,3,4,8 输出1~4,8 ...

  4. sqlldr导入数据取消回显记录条数

    之前在脚本中使用sqlldr导入数据时,如果表的数据量较大的话,会使日志文件变得极大,之后在网上查找了很久,才在一个偶然的机会找到这个参数 silent=all 但是最近发现这样写有个问题,就是加了这 ...

  5. Java只有值传递(Java值传递还是引用传递?)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html 一:区分Java数据类型.变量类型 Java数据类型分两种:基本数据类型.引用类型. ...

  6. Linux计划任务管理

    计划任务 类型:     一次性计划任务     周期性计划任务      一次性计划任务 前提:  atd服务必须运行 [root@wei init.d]# yum -y install at   ...

  7. POJ 2516Minimum Cost(最小费用流+特判)

    [题意]: 有N个人,M个仓库,每个人需要物品,个数都等于共同的K,仓库中有对应的K件物品的数量,随后给K个N*M矩阵(小写k, n, m表示K,N,M对应的子集),表明m个仓库到第n个人的位置运送k ...

  8. xshell 连接报错 Disconnected from remote host

    Type `help' to learn how to use Xshell prompt. [c:\~]$ Connecting to 20.0.0.91:22...Connection estab ...

  9. python nose测试框架全面介绍十三 ---怎么写nose插件

    之前有一篇文章介绍了自己写的插件 nose进度插件,但最近有朋友问我,看着nose的官方文档写的插件没用,下面再详细介绍一下 一.准备 1.新建一个文件夹,随便文件夹的名字,假设文件夹放在f://aa ...

  10. 以py脚本形式ORM操作 及 django终端打印sql语句的设置

    1. 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_loggers': False ...