这道题把我坑了好久......

原因竟是CRT忘了取正数!

题意:求

指数太大了,首先用欧拉定理取模。

由于模数是质数所以不用加上phi(p)

然后发现phi(p)过大,不能lucas,但是它是个square free,可以分解质因数然后lucas然后CRT。

然后就没有然后了......模板套来套去......

注意CRT的结果可能是负数,要取正。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define say(a) printf(#a); printf(" = %lld \n", a)
  4.  
  5. typedef long long LL;
  6. const int N = ;
  7. const LL MO = ;
  8. const LL prime[] = {, , , };
  9.  
  10. int T;
  11. LL n, G;
  12. LL nn[][N], inv[][N], invn[][N], aa[];
  13.  
  14. inline LL qpow(LL a, LL b, LL c) {
  15. LL ans = ;
  16. while(b) {
  17. if(b & ) {
  18. ans = ans * a % c;
  19. }
  20. a = a * a % c;
  21. b = b >> ;
  22. }
  23. return ans;
  24. }
  25. LL C(int a, int b) {
  26. return nn[T][a] * invn[T][b] % prime[T] * invn[T][a - b] % prime[T];
  27. }
  28. LL lucas(int a, int b) {
  29. if(!b) {
  30. return ;
  31. }
  32. return C(a % prime[T], b % prime[T]) * lucas(a / prime[T], b / prime[T]) % prime[T];
  33. }
  34. LL exgcd(LL a, LL b, LL &x, LL &y) {
  35. if(!b) {
  36. x = ;
  37. y = ;
  38. return a;
  39. }
  40. LL g = exgcd(b, a % b, x, y);
  41. std::swap(x, y);
  42. y -= (a / b) * x;
  43. return g;
  44. }
  45.  
  46. inline void prework(int h) {
  47. inv[h][] = ;
  48. LL p = prime[h];
  49. for(int i = ; i < p; i++) {
  50. inv[h][i] = (p - p / i) * inv[h][p % i] % p;
  51. }
  52. nn[h][] = ;
  53. invn[h][] = ;
  54. for(int i = ; i < p; i++) {
  55. nn[h][i] = nn[h][i - ] * i % p;
  56. invn[h][i] = invn[h][i - ] * inv[h][i] % p;
  57. }
  58. return;
  59. }
  60.  
  61. inline LL CRT() {
  62.  
  63. LL M = MO - , ans = , b, t;
  64. for(int i = ; i < ; i++) {
  65. LL m = M / prime[i];
  66. exgcd(m, prime[i], t, b);
  67. t = (t % M + M) % M;
  68. ans += aa[i] * m % M * t % M;
  69. ans %= M;
  70. }
  71.  
  72. return ans;
  73. }
  74.  
  75. int main() {
  76.  
  77. scanf("%lld%lld", &n, &G);
  78. if(G == MO) {
  79. printf("");
  80. return ;
  81. }
  82. for(int i = ; i < ; i++) {
  83. prework(i);
  84. }
  85.  
  86. for(T = ; T < ; T++) {
  87. for(int i = ; i * i <= n; i++) {
  88. if(n % i) {
  89. continue;
  90. }
  91. aa[T] += lucas(n, i);
  92. aa[T] %= prime[T];
  93. if(i * i < n) {
  94. aa[T] += lucas(n, n / i);
  95. aa[T] %= prime[T];
  96. }
  97. }
  98. //printf("aa[%d] = %lld \n", T, aa[T]);
  99. }
  100.  
  101. LL ans = CRT();
  102. //printf("ans = %lld \n", ans);
  103.  
  104. ans = qpow(G, ans, MO);
  105. printf("%lld\n", ans);
  106. return ;
  107. }

AC代码

洛谷P2480 古代猪文的更多相关文章

  1. 洛谷 [P2480] 古代猪文

    卢卡斯定理 注意特判底数和模数相等的情况 http://www.cnblogs.com/poorpool/p/8532809.html #include <iostream> #inclu ...

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

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

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

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

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

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

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

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

  6. P2480 [SDOI2010]古代猪文

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

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

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

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

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

  9. luogu_2480: 古代猪文

    洛谷:2480古代猪文 题意描述: 给定两个整数\(N,G\),求$G^{\sum_{k|n}C_n^k} mod 999911659 $. 数据范围: \(1\leq N\leq 10^9,1\le ...

随机推荐

  1. Express app.listen 函数了解

    最近一直在学习如何用原生的 Node.js 来做一个网站.在写的同时也在学习 Express 源码. 一直觉得 Express 开启服务器的方法挺有趣的,就看了一下. 在 Express 运行的时候会 ...

  2. Servlet——提交表单信息,Servlet之间的跳转

    HTML表单标签:<form></form> 属性: actoion:  提交到的地址,默认为当前页面 method:  表单提交方式 有get和post两种方式,默认为get ...

  3. POJ1035&&POJ3080&&POJ1936

    字符串处理专题,很早就写好了然而忘记写blog了 1035 题意:给你一些单词作为字典.然后让你查找一些单词.对于每个单词,如果在字典中就输出它.否则输出所有它通过删除||增加||替换一个字符能得到的 ...

  4. Ubuntu16.04LTS +Qt+boost1.66编译错误:consuming_buffers.hpp: parse error in template argument list

    升级gcc版本至 6 以上.. 安装gcc-6系列与安装boost (Ubuntu16.04LTS)

  5. Java关键字 Finally执行与break, continue, return等关键字的关系

    长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行之后执行. finally总是在控制转移语 ...

  6. GitHub 新手教程 三,Git Bash

    1,通过 开始菜单 启动 Git Bash,或者 在 cmd 下执行以下命令: D:\SoftWare\Git\git-bash.exe --cd-to-home (D:\SoftWare\Git 是 ...

  7. PAT-1003 Emergency(Dijkstra)

    1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...

  8. 学习 google file system 心得体会

    Google File system文件系统,是在特别便宜的普通硬件设备上运行,它是一个面向大规模数据密集型运用的.可伸缩的分布式文件系统. 与传统文件相比,它认为组件失效是很平常的事件,因为GFS包 ...

  9. p4语言编程环境安装

    p4语言主要是用来模拟交换机的交互,是新一代的SDN解决方案,可以让数据转发平面也具有可编程能力,让软件能够真正定义网络和网络设备.详细介绍 主要流程是:安装vmware.安装Ubuntu.下载Git ...

  10. c# 简易绘制C语言头文件包含关系图 v2.0

    老规矩,先上图 节点样式说明: 1.粉色圆角,说明该节点下有循环引用 2.黄色菱形,说明该节点代表的文件在项目目录下未找到. 3.红色圆角,说明循环引用(从开始到最终,这种感情没变过,没有谁..... ...