1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long int64;
  8. int Case;
  9. #define maxn 200005
  10. #define maxm 600005
  11. int now[maxn],prep[maxm];
  12. int64 val[maxm],pi,pk,t;
  13. int64 ksm(int64 x,int64 y,int64 p){
  14. if (y==) return %p;
  15. if (y==) return x%p;
  16. int64 d=ksm(x,y/,p);
  17. if (y%==) return d*d%p*x%p;
  18. else return d*d%p;
  19. }
  20. int64 exgcd(int64 a,int64 b,int64 &x,int64 &y){
  21. if (b==){
  22. x=,y=;
  23. return a;
  24. }
  25. int64 GCD=exgcd(b,a%b,x,y),temp;
  26. temp=x,x=y,y=temp-a/b*y;
  27. return GCD;
  28. }
  29. void insert(int x,int64 y){
  30. int pos=y%maxn;
  31. prep[x]=now[pos],now[pos]=x,val[x]=y;
  32. }
  33. int search(int64 x){
  34. int pos=x%maxn,ans=maxm*;
  35. for (int i=now[pos];i!=-;i=prep[i]){
  36. if (val[i]==x) ans=min(ans,i);
  37. }
  38. if (ans<maxm*) return ans;
  39. else return -;
  40. }
  41. int64 extanded_baby_step_gaint_step(int64 A,int64 B,int64 C){
  42. int64 tmp,temp=,x,y,D,R,cnt=; int pos;
  43. for (int i=;i<;i++){
  44. if (temp==B) return i;
  45. temp=temp*A%C;
  46. }
  47. D=;
  48. for (temp=exgcd(A,C,x,y);temp!=;cnt++,temp=exgcd(A,C,x,y)){
  49. if (B%temp) return -;
  50. C/=temp,B/=temp;
  51. D=D*(A/temp)%C;
  52. }
  53. memset(now,-,sizeof(now));
  54. R=; tmp=ceil(sqrt(C*1.0));
  55. for (int i=;i<tmp;i++){
  56. insert(i,R);
  57. R=R*A%C;
  58. }
  59. for (int i=;i<tmp;i++){
  60. temp=exgcd(D,C,x,y);
  61. x=(x%C*(B/temp)%C+C)%C;
  62. pos=search(x);
  63. if (pos!=-) return i*tmp+pos+cnt;
  64. D=D*R%C;
  65. }
  66. return -;
  67. }
  68. int64 inv(int64 X){
  69. int64 x,y;
  70. int64 temp=exgcd(X,pk,x,y);
  71. return (x%pk+pk)%pk;
  72. }
  73. int64 work(int64 n){
  74. if (n==) return 1LL%pk;
  75. int64 ans=;
  76. for (int i=;i<=pk;i++) if (i%pi) ans=ans*i%pk;
  77. ans=ksm(ans,n/pk,pk);
  78. int64 k=n%pk;
  79. for (int i=;i<=k;i++) if (i%pi) ans=ans*i%pk;
  80. return ans*work(n/pi)%pk;
  81. }
  82. int64 calc(int64 n,int64 m){
  83. int64 a,b,c; int64 k=;
  84. a=work(n),b=work(n-m),c=work(m);
  85. for (int i=n;i;i/=pi) k+=(i/pi);
  86. for (int i=n-m;i;i/=pi) k-=(i/pi);
  87. for (int i=m;i;i/=pi) k-=(i/pi);
  88. return 1LL*ksm(pi,k,pk)%pk*a%pk*inv(b)%pk*inv(c)%pk;
  89. }
  90. void work1(){
  91. int64 n,m,p;
  92. scanf("%lld%lld%lld",&n,&m,&p);
  93. printf("%lld\n",ksm(n,m,p)%p);
  94. }
  95. void work2(){
  96. int64 A,B,C,ans;
  97. scanf("%lld%lld%lld",&A,&B,&C);
  98. B%=C;
  99. ans=extanded_baby_step_gaint_step(A,B,C);
  100. if (ans==-) printf("Math Error\n");
  101. else printf("%lld\n",ans);
  102. }
  103. void work3(){
  104. int64 n,m,p,temp,x,y,tmp,ans=;
  105. scanf("%lld%lld%lld",&m,&n,&p);
  106. t=p;
  107. for (int i=;i<=sqrt(p);i++){
  108. if (t%i==){
  109. pi=i,pk=;
  110. while (t%i==){
  111. pk=pk*i;
  112. t/=i;
  113. }
  114. temp=exgcd(p/pk,pk,x,y);
  115. tmp=calc(n,m)/temp;
  116. x=x*tmp%p*(p/pk)%p;
  117. ans=(ans+x)%p;
  118. }
  119. }
  120. if (t>){
  121. pi=t,pk=t;
  122. temp=exgcd(p/pk,pk,x,y);
  123. tmp=calc(n,m)/temp;
  124. x=x*tmp%p*(p/pk)%p;
  125. ans=(ans+x)%p;
  126. }
  127. printf("%lld\n",(ans%p+p)%p);
  128. }
  129. int main(){
  130. scanf("%d",&Case);
  131. for (int type;Case;Case--){
  132. scanf("%d",&type);
  133. if (type==) work1();
  134. else if (type==) work2();
  135. else work3();
  136. }
  137. return ;
  138. }

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3283

题目大意:

吐槽:HN2016省队集训原题,辣鸡出题人......

做法:对于操作1,没什么好说的,直接上快速幂即可。

对于操作2,如果p是质数,就是BSGS算法,否则,就用扩展BSGS算法;而实际上扩展BSGS可以解决p是质数,所以就不用分类讨论了。

对于(extended)baby_step_gaint_step算法,未完待续......

对于操作3,组合数取模,扩展lucas定理。

对于组合数取模,未完待续......

bzoj3283: 运算器的更多相关文章

  1. 第一篇T语言实例开发(版本5.3),带错误检测的加减乘除运算器

    带错误检测的加减乘除运算器 表达式 TC综合开发工具里的表达式大体分为:计算表达式.条件表达式 计算表达式: 它一般是用在赋值过程中,或者是和条件表达式混合使用这样的表达式里只有数字运算符(如:+.- ...

  2. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  3. 高级四则运算器—结对项目总结(193 &105)

    高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界 ...

  4. bzoj 3283: 运算器 扩展Baby Step Giant Step && 快速阶乘

    3283: 运算器 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 184  Solved: 59[Submit][Status][Discuss] D ...

  5. Akka(1):Actor - 靠消息驱动的运算器

    Akka是由各种角色和功能的Actor组成的,工作的主要原理是把一项大的计算任务分割成小环节,再按各环节的要求构建相应功能的Actor,然后把各环节的运算托付给相应的Actor去独立完成.Akka是个 ...

  6. 第四次作业 四则运算器在C++层面上的进一步思考

    OOA(Object Oriented Analysis,面向对象分析) 从客观存在的事务和事务之间的关系,归纳出有关对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个 ...

  7. MFC实现一元稀疏多项式运算器

    MFC实现一元稀疏多项式运算器 基本要求 输入并建立两个多项式 多项式a与b相加,建立和多项式c 多项式a与b相减,建立差多项式d 输出多项式a, b, c, d.输出格式:比如多项式a为:A(x)= ...

  8. 结对编程——四则运算器(UI第十组)

    博客目录: 一.问题描述                   二.设计思路                   三.UI开发过程                       四.对接过程       ...

  9. C#四则运算器(多态方法实现)

    在上一节C#课上,我们学习了用类的继承的方式来做一个四则运算器,然而老师的代码在课上演示的效果并不理想,而且没有使用多态的思想实现,今天我们就来用多态的方式实现四则运算器. 1. 题目及要求 2. A ...

随机推荐

  1. Java核心技术点之注解

    本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...

  2. java多线程系类:基础篇:02常用的实现多线程的两种方式

    本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多 ...

  3. IIS 应用程序池.NET40 重新注册

    32位的Windows:---------------------------------------------------------------------------1. 运行->cmd ...

  4. Castle.ActiveRecord 多对多关系 引发的错误处理

    在Castle.ActiveRecord 实体类中,如果两个对象有 “多对多” 关系,一般的做法是将其分解为 两个“一对多”关系,但有时引发了 “您要删除 或 引用 的对象#2在数据库中不存在”的异常 ...

  5. HTTP协议详细总结

    HTTP超文本传输协议,是WWW上应用的最多的协议.了解和掌握HTTP协议是对程序人员的基本要求. 转载请注明出处 http://www.cnblogs.com/zrtqsk/p/3746891.ht ...

  6. Linux epoll 笔记(高并发事件处理机制)

    wiki: Epoll优点: Epoll工作流程: Epoll实现机制: epollevent; Epoll源码分析: Epoll接口: epoll_create; epoll_ctl; epoll_ ...

  7. unittest使用过程中sys.exit(not self.result.wasSuccessful())

    起因: 在运行下面的unittest过程中出现了个Traceback: 被测试脚本: # splitter.py def split(line, types=None, delimiter=None) ...

  8. jquery 使用方法(转)

    原文: http://www.cnblogs.com/Chenfengtao/archive/2012/01/12/2320490.html jQuery是目前使用最广泛的javascript函数库. ...

  9. [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)

    题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...

  10. 匈牙利算法(codevs2776)

    type node=^link; link=record des:longint; next:node; end; var n,m,i,t,num:longint; p:node; nd:..] of ...