(上不了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"
#endifconst 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;
}

转载于:https://www.cnblogs.com/LinnBlanc/p/7763081.html

【bzoj1951】【古代猪文】Lucas定理+欧拉定理+孙子定理相关推荐

  1. 【BZOJ1951】古代猪文(CRT,卢卡斯定理)

    [BZOJ1951]古代猪文(CRT,卢卡斯定理) 题面 BZOJ 洛谷 题解 要求什么很显然吧... \[Ans=G^{\sum_{k|N}{C_N^k}}\] 给定的模数是一个质数,要求解的东西相 ...

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

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

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

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

  4. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

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

  5. BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...

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

  6. P2480 [SDOI2010]古代猪文 Lucas+CRT合并

    \(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...

  7. bzoj1951 [Sdoi2010]古代猪文 lucas+CRT+exgcd

    本来以为要套exlucas的,结果不用,码量就少了很多 注: CRT要  <=0  +=P 区分清楚加减号 码: #include<iostream> #include<cst ...

  8. P2480 [SDOI2010]古代猪文

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

  9. P2480 [SDOI2010]古代猪文(数论好题)

    P2480 [SDOI2010]古代猪文 题意: 给你n和g,求g∑d∣nCndmodpg^{\sum_{d|n}C_{n}^{d}}\bmod pg∑d∣n​Cnd​modp p=999911659 ...

最新文章

  1. 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue...
  2. 人工智能恶意使用报告:预测、预防和缓解
  3. 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
  4. 友盟统计--注意事项
  5. Linux基金会:Linux已经战胜微软
  6. C# WPF MVVM开发框架Caliburn.Micro Screens, Conductors 和 Composition⑦
  7. c++面向对象高级编程 学习十二 模板
  8. Kinect2.0-空间长度测量
  9. 幅度和幅值有区别吗_16G内存够用吗?8G/16G/32G内存横向对比
  10. 学术之路如何走好?过来人的10条建议!
  11. 凸优化问题,凸二次规划问题QP,凸函数
  12. Android 开发即时聊天工具 YQ :(一) Socket 初步
  13. windows下Middlebury离线工具使用(补充)
  14. 如何防止别人QQ群话题发广告和批量QQ群发Q群话题
  15. oracle羊毛,预言机(Oracle)简介和撸羊毛教程— 上篇
  16. c喱c喱是哪国语言,c喱c哩歌词。不要音译
  17. SpringBoot(学习笔记)
  18. (C语言)写一个函数,实现两个字符串的比较, 即自己写一个strcmp函数,函数原型为int strcmp(const char* p1, const char* p2)
  19. 0x80070070 错误
  20. 动物模型/ 心血管疾病模型 / 啮齿动物高血压模型-自发性高血压大鼠(SHR)

热门文章

  1. 计算机课程布置作业,计算机是如何工作的(教案)
  2. 白鹭引擎生成html,初识Egret白鹭引擎 之 创建舞台
  3. slice python_Python slice()
  4. 使用Kotlin的Android菜单
  5. java while循环_Java while循环
  6. python多线程守护线程_Python守护程序线程
  7. C++基础知识(三)C++的输入和输出及操纵符
  8. 开课吧课堂:什么是HashSet类
  9. tomcat 莫名奔溃问题
  10. [MySQL] specified key was too long max key length is 767bytes