算是一道很毒瘤的题目 考试的时候码+调了3h才搞定。

op==1 显然是快速幂。

op==2 有些点可以使用BSGS 不过后面的点是EXBSGS.

这个以前学过了 考试的时候还是懵逼。(当时还是看着花姐姐的题解学的

为了起到再次复习的作用 我决定 再推导一遍。

对于高次同余方程 \(a^x\equiv b(mod p)\) 朴素的BSGS利用是欧拉定理的应用解决的。此时要求(a,p)=1.

考虑解决(a,p)>1的情况 容易发现我们进行一些操作 使得他们互质就可以继续使用EXBSGS了。

当b%p==1时显然x取0 但是当b%p!=1时x有解必然取的时正整数 原式可以变成 \(a^{x-1}\cdot a+kp=b\)

容易发现 当(a,p)|b 等式才有整数解。

当出现上述情况的时候 容易把式子变为 \(a^{x-1}\cdot \frac{a}{(a,p)}\equiv \frac{b}{(a,p)}(mod \frac{p}{(a,p)})\)

可以发现两个式子求解出x后时等价的。

然后如果x和p'还不互质继续下去。直至互质然后解EXBSGS即可。

最后要加回来一直递归下去的次数 可以发现最多递归log层。

值得注意的是再递归的时候如果发现了某一部(a,p)不整除b了 那么还是无解的注意判断。

最后 关于求逆 不是质数了 注意使用exgcd.

op==3.

裸的EXLucas了 也写过很多遍了。值得一提的是 提前预处理跑的是真的快。

  1. const ll MAXN=200010;
  2. ll Q;
  3. ll op,a,b,p,xx,yy;
  4. map<ll,ll>H;
  5. ll y[MAXN],w[MAXN],jc[MAXN],f[MAXN],inv[MAXN],ans[MAXN];
  6. ll flag;
  7. inline void fj(ll x)
  8. {
  9. flag=0;
  10. for(ll i=2;i*i<=x;++i)
  11. {
  12. if(x%i==0)
  13. {
  14. y[++flag]=i;w[flag]=1;
  15. while(x%i==0)
  16. {
  17. x/=i;
  18. w[flag]*=i;
  19. }
  20. }
  21. }
  22. if(x>1)y[++flag]=x,w[flag]=x;
  23. }
  24. inline ll ksm(ll b,ll p,ll mod)
  25. {
  26. ll cnt=1;
  27. while(p)
  28. {
  29. if(p&1)cnt=cnt*b%mod;
  30. b=b*b%mod;p=p>>1;
  31. }
  32. return cnt;
  33. }
  34. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  35. inline void exgcd(ll a,ll b)
  36. {
  37. if(!b){xx=1;yy=0;return;}
  38. exgcd(b,a%b);
  39. ll zz=xx;xx=yy;yy=zz-a/b*yy;
  40. }
  41. inline ll INV(ll a,ll mod)
  42. {
  43. exgcd(a,mod);
  44. return (xx%mod+mod)%mod;
  45. }
  46. inline ll BSGS(ll a,ll b,ll mod)//a^x=b(% mod)
  47. {
  48. a%=mod;b%=mod;
  49. if(b==1)return 0;
  50. H.clear();
  51. ll m=(ll)sqrt(mod*1.0)+1;
  52. ll w1=1;H[b]=0;
  53. rep(1,m,i)
  54. {
  55. w1=w1*a%mod;
  56. ll cc=w1*b%mod;
  57. H[cc]=max(H[cc],i);
  58. }
  59. ll cc=1;
  60. rep(1,m,i)
  61. {
  62. cc=cc*w1%mod;
  63. if(H.find(cc)!=H.end())
  64. return i*m-H[cc];
  65. }
  66. return -1;
  67. }
  68. inline ll exBSGS()
  69. {
  70. a%=p;b%=p;
  71. if(b==1)return 0;
  72. ll k=0;
  73. ll wp=p,w1=1,g;
  74. while((g=gcd(a,wp))>1)
  75. {
  76. if(b%g)return -1;
  77. ++k;w1=a/g;b=b/g;wp=wp/g;
  78. b=b*INV(w1,wp)%p;
  79. if(b==1)return k;
  80. }
  81. ll ans=BSGS(a,b,wp);
  82. return ans<0?ans:ans+k;
  83. }
  84. inline ll C(ll a,ll b,ll mod)
  85. {
  86. return ((jc[a]*inv[b]%mod)*(inv[a-b]))%mod;
  87. }
  88. inline void prepare(ll mod)
  89. {
  90. jc[0]=1;
  91. for(ll i=1;i<mod;++i)jc[i]=jc[i-1]*i%mod;
  92. inv[mod-1]=ksm(jc[mod-1],mod-2,mod);
  93. for(ll i=mod-2;i>=0;--i)inv[i]=inv[i+1]*(i+1)%mod;
  94. }
  95. inline ll Lucas(ll a,ll b,ll mod)
  96. {
  97. if(a<b)return 0;
  98. if(a<=mod)return C(a,b,mod);
  99. return (Lucas(a%mod,b%mod,mod)*Lucas(a/mod,b/mod,mod))%mod;
  100. }
  101. inline ll lc(ll x,ll p,ll pp)
  102. {
  103. if(x<=p)return f[x];
  104. ll ww=x/pp;
  105. return ksm(f[pp],ww,pp)*f[x%pp]%pp*lc(x/p,p,pp)%pp;
  106. }
  107. inline ll js(ll x,ll xx,ll xxx,ll mod)
  108. {
  109. ll w=1;
  110. ll cnt=0;
  111. while(x>w)
  112. {
  113. w=w*mod;
  114. cnt+=x/w;
  115. cnt-=xx/w;
  116. cnt-=xxx/w;
  117. }
  118. return cnt;
  119. }
  120. inline void ycl(ll p,ll pp)
  121. {
  122. f[0]=1;
  123. rep(1,pp,i)if(i%p)f[i]=f[i-1]*i%pp;
  124. else f[i]=f[i-1];
  125. }
  126. inline ll solve(ll a,ll b,ll p,ll pp)
  127. {
  128. ll k=js(a,b,a-b,p);
  129. ll ans1,ans2,ans3;
  130. ans1=lc(a,p,pp);
  131. ans2=lc(b,p,pp);
  132. ans3=lc(a-b,p,pp);
  133. ans2=INV(ans2,pp);
  134. ans3=INV(ans3,pp);
  135. ans1=((((ans1*ans2%pp)*ans3)%pp)*ksm(p,k,pp))%pp;
  136. return ans1;
  137. }
  138. inline ll merge()
  139. {
  140. ll an=0;
  141. for(ll i=1;i<=flag;++i)
  142. {
  143. ll M=p/w[i];
  144. ll ww=INV(M,w[i]);
  145. an=(an+((M*ww%p)*ans[i])%p)%p;
  146. }
  147. return an;
  148. }
  149. signed main()
  150. {
  151. //freopen("1.in","r",stdin);
  152. freopen("calculator.in","r",stdin);
  153. freopen("calculator.out","w",stdout);
  154. get(Q);
  155. rep(1,Q,i)
  156. {
  157. get(op);get(a);get(b);get(p);
  158. if(op==1)putl(ksm(a,b,p));
  159. if(op==2)
  160. {
  161. fj(p);ll ww;
  162. if(flag==1&&y[1]==w[1])ww=BSGS(a,b,p);
  163. else ww=exBSGS();
  164. if(ww<0)puts("Math Error");
  165. else putl(ww);
  166. }
  167. if(op==3)
  168. {
  169. swap(a,b);
  170. fj(p);
  171. if(flag==1&&y[1]==w[1])
  172. {
  173. prepare(p);
  174. putl(Lucas(a,b,p));
  175. }
  176. else
  177. {
  178. rep(1,flag,i)
  179. {
  180. ycl(y[i],w[i]);
  181. ans[i]=solve(a,b,y[i],w[i]);
  182. }
  183. putl(merge());
  184. }
  185. }
  186. }
  187. return 0;
  188. }

4.18 省选模拟赛 无聊的计算器 CRT EXBSGS EXLucas的更多相关文章

  1. 6.18 省选模拟赛 树 倍增 LCT

    LINK:树 考虑暴力 保存每个版本的父亲 然后暴力向上跳.得分20. 考虑离线 可以离线那么就可以先把树给搞出来 然后考虑求k级祖先 可以倍增求. 如何判断合法 其实要求路径上的边的时间戳<= ...

  2. 6.18 省选模拟赛 字符串 LCT SAM

    LINK:字符串 看起来很难做 考虑一种暴力 建立SAM后每次查询暴力扫儿子. 期望得分10分.实际得分10分. 另外一种发现每次扫儿子过于暴力 可以每次儿子向上做贡献 每次都暴力向上跳. 期望得分1 ...

  3. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  4. 18/9/21模拟赛-Updated

    18/9/21模拟赛 期望得分:100:实际得分:0  qwq 拿到题目第一眼,我去,这不是洛谷原题(仓鼠找Sugar)吗 又多看了几眼,嗯,对,除了是有多组数据外,就是原题 然后码码码....自以为 ...

  5. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  6. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  7. 【FJOI 20170305】省选模拟赛

    题面被改成了个猪... T1猪猪划船(boat) [题目描述] 6只可爱的猪猪们一起旅游,其中有3只大猪A,B,C,他们的孩子为3只小猪a,b,c.由于猪猪们十分凶残,如果小猪在没有父母监护的情况下, ...

  8. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  9. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

随机推荐

  1. 我是如何用 CSS 绘制各种形状的

    自适应的椭圆 1.自适应的椭圆 实现方式是通过border-radius这个属性:border-radius它可以单独指定水平和垂直半径.用 / 分隔这两个值.并且该属性的值不仅可以接受长度值,还能接 ...

  2. 读CSAPP第一章的收获

    这个系列只写了CSAPP第三版对于我的收获. 里面的内容很多,我只写我以前不知道的,然后现在又觉得挺有用的内容. 没有很好的排版,将就看. Amadhl定律:主要观点,想要显著加速整个系统,必须提升全 ...

  3. 如何Simplest搭建个人博客

    前期 例如wordpress.hexo.hugo-- 准备 安装Node.js,安装Git,进入Hexo网站.进入Github网站进注册和登录. 建议买个阿里云服务器(学生最近好像是免费的) 开始搭建 ...

  4. Scrapy模拟登录赶集网

    1.打开赶集网登录界面,先模拟登录并抓包,获得post请求的request参数 2. 我们只需构造出上面的参数传入formdata即可 参数分析: setcookie:为自动登录所传的值,不勾选时默认 ...

  5. MobileNetV1/V2/V3简述 | 轻量级网络

    MobileNet系列很重要的轻量级网络家族,出自谷歌,MobileNetV1使用深度可分离卷积来构建轻量级网络,MobileNetV2提出创新的inverted residual with line ...

  6. day58 前端收尾

    目录 一.jQuery结束 1 阻止后续事件执行 2 阻止事件冒泡 3 事件委托 4 页面加载 5 动画效果 6 补充知识点 二.前端框架Bootstrap 1 布局容器 2 栅格系统 3 栅格参数 ...

  7. day29 作业

    1.引入属性访问控制+property 2.引入继承与派生的概念来减少代码冗余 注意:要满足什么"是"什么的关系,不满足"是"的关系不要去继承 import u ...

  8. 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

    下面代码中 a 在什么情况下会打印 1? var a = ?; if(a == 1 && a == 2 && a == 3){ console.log(1); } 这个 ...

  9. Scala 面向对象(十二):嵌套类

    在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构.如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样. 嵌套类类似于Java中的内部类. Scala嵌套类的使用1 请编写程序, ...

  10. Scala 基础(九):Scala 函数式编程(一)基础(一)概念、定义、调用机制

    1 概念的说明 1)在scala中,方法和函数几乎可以等同(比如他们的定义.使用.运行机制都一样的),只是函数的使用方式更加的灵活多样. 2)函数式编程是从编程方式(范式)的角度来谈的,可以这样理解: ...