【题解】古代猪文 [SDOI2010] [BZOJ1951] [P2480]
【题解】古代猪文 [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]的更多相关文章
- 「SDOI2010」古代猪文(bzoj1951)
题目写了一大堆背景. 一句话题意就是求 $q^{\sum_{d|n}C_{n}^{d}} \mod 999911659$. 因为$n$是质数,只有当$q$是$n$的倍数时(此题数据范围原因,最多$q= ...
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...
- 【BZOJ1951】[SDOI2010]古代猪文
[BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...
- 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT
[BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
- P2480 [SDOI2010]古代猪文
P2480 [SDOI2010]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...
随机推荐
- 监控微信小程序wx.request请求失败
在微信小程序里,与后台服务器交互的主要接口函数是wx.request(),用于发起 HTTPS 网络请求.其重要性不言而喻.然而,却经常遇到请求失败的问题,笔者特意谷歌"wx.request ...
- nginx实现反向代理 配置多域名以及多端口号
多个服务部署在同一个服务器,使用不同的端口. 一.思考过程 如果不想带上端口号,就只能访问 80 或 443 端口. 可以用过二级目录区分服务,通过反向代理转发到不同的 Server. 可以用过子域名 ...
- Linux shell if条件判断1
shell 逻辑控制语句: 分支判断结构 if case 循环结构 for while unt ...
- Alipay 支付宝SDK PHP Fatal error: Class 'LtObjectUtil' not found in。
在linux 上运行报错:PHP Fatal error: Class 'LtObjectUtil' not found in. 这是因为人家用的lotusphp框架,和你正在使用的框架冲突了!比如 ...
- shell 脚本命令之alias
1.alias的功能 设置一个别名,即为一个长命令起一个新的名字 2.alias的基本格式 alias alias_name='origin_command' alias是指定别名命令的关键字 a ...
- 08-cmake语法-set()
CMake的基本数据类型是字符串,一组字符串在一起称为列表(list) 用于设置变量. set(VAR a b c) # 输出 VAR = a;b;c VAR 就是一个list 参考: https:/ ...
- Django学习(不定期更新)
基于luffy项目的疑问点解决 删除掉.git文件夹,应该是该项目不需要git 在git克隆代码之后,初始化git,自动创建git仓库需要的目录,这些文件夹存在于项目下的.git文件夹中 .git文件 ...
- Echarts在同一网页按顺序展示多图
Echarts Page:同一网页按顺序展示多图 from pyecharts import Page page = Page("") page.add(pie).add(frie ...
- Utterance-level Aggregation for Speaker Recognition in The Wild
文章[1]主要针对的是语句长度不定,含有不相关信号的说话人识别. 深度网络设计的关键在于主干(帧级)网络的类型[the type of trunk (frame level) network]和有时间 ...
- 2.搭建第一个http服务:三层架构
package main import ( "github.com/go-kit/kit/transport/http" "gomicro/Services" ...