【bzoj1951】【古代猪文】Lucas定理+欧拉定理+孙子定理
(上不了p站我要死了,当然是游戏原画啊)
Description
(题面倒是很有趣,就是太长了)
题意:
一个朝代流传的猪文文字恰好为N的k分之一,其中k是N的一个正约数(可以是1和N)。不过具体是哪k分之一,以及k是多少,由于历史过于久远,已经无从考证了。考虑到所有可能的k。显然当k等于某个定值时,该朝的猪文文字个数为N / k。然而从N个文字中保留下N / k个的情况也是相当多的。如果所有可能的k的所有情况数加起来为P的话,那么他研究古代文字的代价将会是G的P次方。 现在他想知道研究古代文字的代价除以999911659的余数是多少。
Input
有且仅有一行:两个数N、G,用一个空格分开。
Output
有且仅有一行:一个数,表示答案除以999911659的余数。
Sample Input
4 2
Sample Output
2048
HINT
10%的数据中,1 <= N <= 50;
20%的数据中,1 <= N <= 1000;
40%的数据中,1 <= N <= 100000;
100%的数据中,1 <= G <= 1000000000,1 <= N <= 1000000000。
若留下来的文字个数为x,则可能的情况有C(n,x)个。用o(sqrt(n))的复杂度来算出所有的可能情况。这样就可以统计出指数了。
但是这道题的精髓是取模上。
设指数为x,则由欧拉定理得G^x≡G^(x%φ(M)) (mod M),gcd(G,M)==1
M=999911659,但是却惊讶的发现φ(M)=999911658,并不是一个质数。这下就GG了,因为题目的数据范围很明显要用Lucas定理,但是Lucas需要模数是质数。
这里就需要用上Lucas的一个拓展了。虽然模数不是质数不能直接用Lucas,但是如果模数可以分解成若干个不同的质数(每个质数最多出现一次)的乘积,就可以用孙子定理(中国剩余定理)来解决。
具体操作:
999911658=2*3*4679*35617
则可得出指数x需满足:x≡a1(mod 2), x≡a2(mod 3), x≡a3(mod 4679), x≡a4(mod 35617)
所以就用孙子定理(发现基本的孙子定理比拓展的孙子定理好些多了)。
还有一点需要注意:
欧拉定理的使用条件是gcd(G,M)==1,如果G==M则要输出0。
(就在这里wa了)
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#ifdef WIN32
#define RIN "%I64d"
#else
#define RIN "%lld"
#endif
const ll mod=999911659;
ll g[5]={0,2,3,4679,35617},sum[5];
ll jiec[36000],niy[36000];
ll n,G;
void exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1,y=0;return;
}
ll x0,y0;
exgcd(b,a%b,x0,y0);
x=y0;
y=x0-(a/b)*y0;
}
ll inverse(ll a,ll b){
ll x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
void init(int x){
memset(jiec,0,sizeof(jiec));
memset(niy,0,sizeof(niy));
jiec[0]=niy[0]=1;
for(int i=1;i<x;i++) jiec[i]=jiec[i-1]*i%x;
niy[x-1]=inverse(jiec[x-1],x);
for(int i=x-2;i>=1;i--) niy[i]=niy[i+1]*(i+1)%x;
}
ll comb(ll a,ll b,ll x){
return jiec[a]*niy[b]%x*niy[a-b]%x;
}
ll lucas(ll a,ll b,ll x){
if(a<b) return 0;
if(b==0) return 1;
if(a<x&&b<x) return comb(a,b,x);
return lucas(a/x,b/x,x)*lucas(a%x,b%x,x)%x;
}
ll power(ll a,ll b){
ll rt=1;
for(;b;b>>=1,a=(a*a)%mod)
if(b&1) rt=(rt*a)%mod;
return rt;
}
int main(){
scanf(RIN,&n);
scanf(RIN,&G);
if(G==mod){
printf("0\n");
return 0;
}
for(int k=1;k<=4;k++){
init(g[k]);
for(int i=1;i*i<=n;i++){
if(n%i) continue;
sum[k]=(sum[k]+lucas(n,i,g[k]))%g[k];
if(i*i!=n) sum[k]=(sum[k]+lucas(n,n/i,g[k]))%g[k];
}
}
ll M=mod-1,Mi,Ri;
for(int i=1;i<=4;i++){
Mi=M/g[i];
Ri=inverse(Mi,g[i]);
sum[0]=(sum[0]+sum[i]*Mi%M*Ri%M)%M;
}
printf(RIN"\n",power(G,sum[0]));
return 0;
}
【bzoj1951】【古代猪文】Lucas定理+欧拉定理+孙子定理的更多相关文章
- 【BZOJ1951】古代猪文(CRT,卢卡斯定理)
[BZOJ1951]古代猪文(CRT,卢卡斯定理) 题面 BZOJ 洛谷 题解 要求什么很显然吧... \[Ans=G^{\sum_{k|N}{C_N^k}}\] 给定的模数是一个质数,要求解的东西相 ...
- BZOJ1951 古代猪文 【数论全家桶】
BZOJ1951 古代猪文 题目链接: 题意: 计算\(g^{\sum_{k|n}(^n_k)}\%999911659\) \(n\le 10^9, g\le 10^9\) 题解: 首先,根据扩展欧拉 ...
- 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT
[BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】
数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...
- 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...
- BZOJ1951:[SDOI2010]古代猪文(Lucas,CRT)
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
随机推荐
- Python全栈工程师(列表、拷贝)
ParisGabriel 感谢 大家的支持 你们的阅读评价就是我最好的更新动力 我会坚持吧排版做的越来越好 每天坚持 一天一篇 点个订阅吧 灰常感谢 当个死粉也阔以 Py ...
- [0] OpenCV_Notes - 琐碎
CV_8UC1,CV_8UC2,CV_8UC3等意思 一般的图像文件格式使用的是 Unsigned 8bits,CvMat矩阵对应的参数类型就是CV_8UC1,CV_8UC2,CV_8UC3.最后的C ...
- pom中的resources设置
Maven项目中一般都会把配置文件放到src/main/resources目录下,有时为了满足多个环境打包发布,可能会创建一些自定义目录来放置各环境的配置文件,如:src/main/profile/d ...
- HashMap 的深入学习
Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashMap和TreeMap,类继承关系如下图 ...
- android桌面悬浮窗实现
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 C: 挂盐水
http://acm.ocrosoft.com/problem.php?cid=1316&pid=2 题目描述 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴 ...
- PHP字符串基本操作函数
常用函数: trim():去除字符串的空格及传入的参数 strlen():获取字符串长度 substr():按照两个参数截取字符串 str_replace():字符串替换 str_split():将字 ...
- php + ajax实现 帖子点赞功能
知识: 一.首先页面需要加载jquery框架 二.ajax常用参数解释: ①.type:传输数据方式,get或者post ②.url:处理数据的PHP脚本 ③.data:传输的数据索引及值,值用js获 ...
- 【转发】Build Squid with SSL Bump and ICAP Client
原文文档:http://docs.diladele.com/administrator_guide_3_4/installation_and_removal/filtering_https.html ...
- 《c程序设计语言》读书笔记-3.5-按要求进制位数字转字符串
#include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...