呜啊啊啊啊,选错了题,原以为很简单的优化+剪枝就能过结果牵扯到了一堆数论知识。我的错,贴上我的代码(已经尽量优化了)

  1. const maxn=;
  2. var n,g,i,j,ans:longint;
  3. tem:int64;
  4. function pow(g,x:longint):longint;
  5. var
  6. now,tem,i,t:int64;
  7. begin
  8. tem:=; now:=g;
  9. if g= then exit();
  10. while now<maxn do
  11. begin
  12. now:=now*now;
  13. tem:=tem*;
  14. end;
  15. now:=now mod maxn;
  16. if (now=) and (x div tem>=) then exit();
  17. if x div tem>= then t:=pow(now,x div tem)
  18. else t:=;
  19. now:=g; x:=x-tem*(x div tem);
  20. while x<> do
  21. begin
  22. if (x mod )= then begin
  23. t:=(t*now) mod maxn;
  24. end;
  25. now:=(now*now) mod maxn;
  26. x:=x div ;
  27. end;
  28. exit(t mod maxn);
  29. end;
  30. function c(x:longint):longint;
  31. var i:longint;
  32. tem:int64;
  33. begin
  34. tem:=g;
  35. for i:= to x do
  36. tem:=pow(tem,n-i+) mod maxn;
  37. for i:= to x do tem:=trunc(exp(ln(tem)/i));
  38. exit(tem);
  39. end;
  40. begin
  41. readln(n,g);
  42. tem:=;
  43. for i:= to trunc(sqrt(n)) do
  44. if n mod i= then
  45. begin
  46. if i*i<>n then tem:=tem*((c(i) mod maxn)*(c(n div i) mod maxn) mod maxn) mod maxn
  47. else tem:=(tem*c(i)) mod maxn;
  48. end;
  49. writeln(tem mod maxn);
  50. end.

然而正确的是。。

  1. #include <cstring>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <cstdio>
  6. using namespace std;
  7. #define maxn 35620
  8. typedef long long LL;
  9. #define MOD 999911659
  10. #define M 999911658
  11. LL w[]={,,,};
  12. LL a[];
  13. LL fac[][maxn];
  14. LL Pow(LL a,LL b,LL mod)//快速幂
  15. {
  16. LL ans=;
  17. while(b)
  18. {
  19. if(b&) ans=(ans*a)%mod;
  20. a=(a*a)%mod;
  21. b >>= ;
  22. }
  23. return ans;
  24. }
  25. void init()//预处理阶乘
  26. {
  27. for(int i=;i<;i++)
  28. {
  29. fac[i][]=;
  30. for(int j=;j<=w[i];j++)
  31. {
  32. fac[i][j]=(fac[i][j-]*j)%w[i];
  33. }
  34. }
  35. }
  36. /********************************
  37. * 组合数取模用费马小定理
  38. *********************************/
  39. LL C(LL n,LL m,int x)//组合数取模
  40. {
  41. if(n < m) return ;
  42. return (fac[x][n] * Pow((fac[x][n-m]*fac[x][m]),w[x]-,w[x]))%w[x];
  43. }
  44. /*******************************
  45. * lucas 处理大组合数取模
  46. ********************************/
  47. LL Lucas(LL n,LL m,int x)//lucas定理
  48. {
  49. if(m==) return ;
  50. return (Lucas(n/w[x],m/w[x],x)*C(n%w[x],m%w[x],x))%w[x];
  51. }
  52. /****************************
  53. * 扩展欧几里得求乘法逆元
  54. *****************************/
  55. LL exgcd(LL a,LL b,LL &x,LL &y)//乘法逆元
  56. {
  57. if(!b){x = ;y = ;return a;}
  58.  
  59. LL ans = exgcd(b,a%b,x,y);
  60.  
  61. LL t = x;x = y;y = t - a/b*y;
  62.  
  63. return ans;
  64. }
  65. /***************************************************************************************
  66. * 中国剩余定理:
  67. * x = b1 % m1
  68. * x = b2 % m2
  69. * x = b3 % m3
  70. * .
  71. * gcd(m1,m2,m3,...) = 1;
  72. * M = m1 * m2 * m3 *.....;
  73. * M1 = m2 * m3 * ...., M2 = m1 * m3 * ...., M3 = m1 * m2 * m4 *....., ......;
  74. * M1 * M(-1) = 1 % M ,M2 * M2(-1) = 1 % M;
  75. * res = (M1(-1)*b1 + M2(-1)*b2+.....)%M;res即为所求值
  76. * 注:如果取模的值相同:都是m1 那么 bn的值可以相加计算;
  77. * 略屌。。。。。。。。。。。。。。
  78. *
  79. *****************************************************************************************/
  80. LL CRT()//计算组合数和取模之后的值
  81. {
  82. LL i,d,x0,y0,ans=;
  83. for(i = ;i < ;i++)//中国剩余定理
  84. {
  85. d=M/w[i];
  86. exgcd(d,w[i],x0,y0);
  87. ans=(ans+d*x0*a[i])%M;
  88. }
  89. if(ans <= ) ans += M;
  90. return ans;
  91. }
  92. int main()
  93. {
  94. init();
  95. LL g,n;
  96. while(cin>>n>>g)
  97. {
  98. memset(a,,sizeof(a));
  99. for(int i=;i*i<=n;i++)
  100. {
  101. if(n%i==)
  102. {
  103. LL tmp=n/i;
  104. for(int j=;j<;j++)
  105. {
  106. if(tmp!=i) a[j]=(a[j]+Lucas(n,i,j))%w[j];
  107. a[j]=(a[j]+Lucas(n,tmp,j))%w[j];
  108. }
  109. }
  110. }
  111. cout<<Pow(g%MOD,CRT(),MOD)<<endl;
  112. }
  113. return ;
  114. }

我就不想多说了=-=

(转载请注明出处:http://www.cnblogs.com/Kalenda/)

P1951: [Sdoi2010]古代猪文的更多相关文章

  1. BZOJ 1951: [Sdoi2010]古代猪文( 数论 )

    显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...

  2. 1951: [Sdoi2010]古代猪文

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2171  Solved: 904[Submit][Status] ...

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

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

  4. [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)

    [SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 第四次java实验报告

    20145306 实验四 java 开发基础 设计过程: 1.创建项目 2.选择activity_main.xml 3.显示自己的学号 4.双击改变字体大小 5.预览

  2. 何时使用 Em 与 Rem

    原文  http://www.w3cplus.com/css/when-to-use-em-vs-rem.html   你可能已经很熟练使用这两个灵活的单位,但你可能不完全了解何时使用rem,何时使用 ...

  3. IIS FTP文件服务器搭建步骤

    利用IIS搭建需要验证用户用的FTP服务器(当然也可以不用验证,为了安全,添加验证) 1.C盘下创建文件夹,iftppub 2.打开关闭Windows功能,Internet信息服务全选,操作完后,重启 ...

  4. ASP.NET 项目 App_Code下无法找到类

    APP_CODE 默认情况下,VS2010中新建的WebApplication中是没有App_Code文件夹的,若需要使用,可以自己手动添加文件夹,然后将文件夹名称设置为App_Code,然后在该文件 ...

  5. MYSQL将表名称修改成大写的存储过程

    1. 条件: 1.1 Mysql设置对大小写敏感 2. 执行下述存储过程: #call uppercase('库名') DROP PROCEDURE IF EXISTS uppercase; )) B ...

  6. Linux程序分析工具:ldd和nm

    ldd和nm是Linux下两个非常实用的程序分析工具.其中,ldd是用来分析程序运行时需要依赖的动态链接库的工具,nm是用来查看指定程序中的符号表信息的工具. 1 ldd 格式:ldd [option ...

  7. ChainOfResponsibility

    #include <iostream> using namespace std; class Chain { public: bool Handle() { return false; } ...

  8. c语言学习的第五天

    #include<stdio.h> #include<stdbool.h> int main() { _Bool num=1; if (num==true); { printf ...

  9. paypal api 相关资料

    https://developer.paypal.com/ https://developer.paypal.com/docs/classic/api/merchant/GetBalance_API_ ...

  10. 第十三章 调试及安全性(In .net4.5) 之 验证程序输入

    1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...