今天研究了一下这块内容...首先是板子

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  29. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  30. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  31. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  32. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  33. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  34. #define SZ 666666
  35. template<class T>
  36. inline T dw();
  37. template<>
  38. inline ll dw<ll>() {return 1;}
  39. template<>
  40. inline int dw<int>() {return 1;}
  41. typedef pair<ll,ll> pll;
  42. ll pll_s;
  43. inline pll mul(pll a,pll b,ll p)
  44. {
  45. pll ans;
  46. ans.fi=a.fi*b.fi%p+a.se*b.se%p*pll_s%p;
  47. ans.se=a.fi*b.se%p+a.se*b.fi%p;
  48. ans.fi%=p; ans.se%=p;
  49. return ans;
  50. }
  51. inline ll mul(ll a,ll b,ll c)
  52. {return a*b%c;}
  53. //a^b mod c
  54. template<class T>
  55. T qp(T a,ll b,ll c)
  56. {
  57. T ans=dw<T>();
  58. while(b)
  59. {
  60. if(b&1) ans=mul(ans,a,c);
  61. a=mul(a,a,c); b>>=1;
  62. }
  63. return ans;
  64. }
  65. inline ll ll_rnd()
  66. {
  67. ll ans=0;
  68. for(int i=1;i<=5;i++)
  69. ans=ans*32768+rand();
  70. if(ans<0) ans=-ans;
  71. return ans;
  72. }
  73. //(x,y) -> x+sqrt(pll_s)*y
  74. template<>
  75. inline pll dw<pll>() {return pll(1,0);}
  76. //find (possibly) one root of x^2 mod p=a
  77. //correctness need to be checked
  78. ll sqr(ll a,ll p)
  79. {
  80. if(!a) return 0;
  81. if(p==2) return 1;
  82. ll w,q;
  83. while(1)
  84. {
  85. w=ll_rnd()%p;
  86. q=w*w-a;
  87. q=(q%p+p)%p;
  88. if(qp(q,(p-1)/2,p)!=1)
  89. break;
  90. }
  91. pll_s=q;
  92. pll rst=qp(pll(w,1),(p+1)/2,p);
  93. ll ans=rst.fi; ans=(ans%p+p)%p;
  94. return ans;
  95. }
  96. //solve x^2 mod p=a
  97. vector<ll> all_sqr(ll a,ll p)
  98. {
  99. vector<ll> vec;
  100. a=(a%p+p)%p;
  101. if(!a) {vec.pb(0); return vec;}
  102. ll g=sqr(a,p);
  103. ll g2=(p-g)%p;
  104. if(g>g2) swap(g,g2);
  105. if(g*g%p==a) vec.pb(g);
  106. if(g2*g2%p==a&&g!=g2) vec.pb(g2);
  107. return vec;
  108. }
  109. ll s3_a;
  110. //f0+f1*x+f2*x^2 (for x^3=s3_a)
  111. struct s3
  112. {
  113. ll s[3];
  114. s3() {s[0]=s[1]=s[2]=0;}
  115. s3(ll* p) {s[0]=p[0]; s[1]=p[1]; s[2]=p[2];}
  116. s3(ll a,ll b,ll c) {s[0]=a; s[1]=b; s[2]=c;}
  117. };
  118. template<>
  119. s3 dw<s3>() {return s3(1,0,0);}
  120. s3 rs3(ll p)
  121. {
  122. return s3(ll_rnd()%p,ll_rnd()%p,ll_rnd()%p);
  123. }
  124. s3 mul(s3 a,s3 b,ll p)
  125. {
  126. ll k[3]={};
  127. for(int i=0;i<3;i++)
  128. {
  129. for(int j=0;j<3;j++)
  130. {
  131. if(i+j<3) k[i+j]+=a.s[i]*b.s[j]%p;
  132. else k[i+j-3]+=a.s[i]*b.s[j]%p*s3_a%p;
  133. }
  134. }
  135. for(int i=0;i<3;i++) k[i]%=p;
  136. return s3(k[0],k[1],k[2]);
  137. }
  138. //solve x^3 mod p=a
  139. vector<ll> all_cr(ll a,ll p)
  140. {
  141. vector<ll> vec;
  142. a=(a%p+p)%p;
  143. if(!a) {vec.pb(0); return vec;}
  144. if(p<=3)
  145. {
  146. for(int i=0;i<p;i++)
  147. {
  148. if(i*i*i%p==a) vec.pb(i);
  149. }
  150. return vec;
  151. }
  152. if(p%3==2)
  153. {
  154. vec.pb(qp(a,(p*2-1)/3,p));
  155. return vec;
  156. }
  157. if(qp(a,(p-1)/3,p)!=1) return vec;
  158. ll l=(sqr(p-3,p)-1)*qp(2LL,p-2,p)%p,x;
  159. s3_a=a;
  160. while(1)
  161. {
  162. s3 u=rs3(p);
  163. s3 v=qp(u,(p-1)/3,p);
  164. if(v.s[1]&&!v.s[0]&&!v.s[2])
  165. {x=qp(v.s[1],p-2,p); break;}
  166. }
  167. x=(x%p+p)%p;
  168. vec.pb(x); vec.pb(x*l%p); vec.pb(x*l%p*l%p);
  169. sort(vec.begin(),vec.end());
  170. return vec;
  171. }
  172. map<ll,ll> gg;
  173. ll yss[2333]; int yyn=0;
  174. //find x's primitive root
  175. inline ll org_root(ll x)
  176. {
  177. ll& pos=gg[x];
  178. if(pos) return pos;
  179. yyn=0; ll xp=x-1;
  180. for(ll i=2;i*i<=xp;i++)
  181. {
  182. if(xp%i) continue;
  183. yss[++yyn]=i;
  184. while(xp%i==0) xp/=i;
  185. }
  186. if(xp!=1) yss[++yyn]=xp;
  187. ll ans=1;
  188. while(1)
  189. {
  190. bool ok=1;
  191. for(int i=1;i<=yyn;i++)
  192. {
  193. ll y=yss[i];
  194. if(qp(ans,(x-1)/y,x)==1) {ok=0; break;}
  195. }
  196. if(ok) return pos=ans;
  197. ++ans;
  198. }
  199. }
  200. map<ll,int> bsgs_mp;
  201. //find smallest x: a^x mod p=b
  202. ll bsgs(ll a,ll b,ll p)
  203. {
  204. if(b==0) return 1;
  205. map<ll,int>& ma=bsgs_mp;
  206. ma.clear();
  207. //only /2.5 for speed...
  208. ll hf=sqrt(p)/2.5+2,cur=b;
  209. for(int i=0;i<hf;i++)
  210. ma[cur]=i+1, cur=cur*a%p;
  211. ll qwq=1,qh=qp(a,hf,p);
  212. for(int i=0;;i++)
  213. {
  214. if(i)
  215. {
  216. if(ma.count(qwq))
  217. return i*hf-(ma[qwq]-1);
  218. }
  219. qwq=qwq*(ll)qh%p;
  220. }
  221. return 1e18;
  222. }
  223. //ax+by=1
  224. void exgcd(ll a,ll b,ll& x,ll& y)
  225. {
  226. if(b==0) {x=1; y=0; return;}
  227. exgcd(b,a%b,x,y);
  228. ll p=x-a/b*y; x=y; y=p;
  229. }
  230. template<class T>
  231. T gcd(T a,T b) {if(b) return gcd(b,a%b); return a;}
  232. //solve x^a mod p=b
  233. vector<ll> kr(ll a,ll b,ll p)
  234. {
  235. vector<ll> rst;
  236. if(!b) {rst.pb(0); return rst;}
  237. ll g=org_root(p);
  238. ll pb=bsgs(g,b,p);
  239. ll b1=a,b2=p-1,c=pb;
  240. ll gg=gcd(b1,b2);
  241. if(c%gg) return rst;
  242. b1/=gg, b2/=gg, c/=gg;
  243. ll x1,x2; exgcd(b1,b2,x1,x2);
  244. x1*=c; x1=(x1%b2+b2)%b2;
  245. ll cs=qp(g,x1,p),ec=qp(g,b2,p);
  246. for(ll cur=x1;cur<p-1;cur+=b2)
  247. rst.pb(cs), cs=cs*ec%p;
  248. sort(rst.begin(),rst.end());
  249. return rst;
  250. }

这份代码可以解决1014、1039、1038三道题。感人至深

参考链接是糖老师的这篇文章:http://blog.csdn.net/skywalkert/article/details/52591343?locationNum=3&fps=1

感觉二次和三次剩余里面已经讲得挺清楚了,注意三次剩余里面那个多项式群里面自变量取值是满足x^3=a的。

这里就讲一下k次剩余娱乐一下。

我们要解x^a mod p=b,p是个质数,那么p就有原根g。

考虑两边对原根g取log,设g^r=b,r可以用bsgs求出来,那么我们就是要求s*a mod (p-1)=r,那么x就等于g^s。

这个东西我们可以设s*a+qwq*(p-1)=r,先把(a,p-1)约分,用exgcd解出来一个s,然后就只要加上(约分后的p-1)的倍数就可以剩下的解了。

此外这题需要卡常,见bsgs函数里的/2.5。

二次剩余、三次剩余、k次剩余的更多相关文章

  1. 【51nod】1123 X^A Mod B (任意模数的K次剩余)

    题解 K次剩余终极版!orz 写一下,WA一年,bug不花一分钱 在很久以前,我还认为,数论是一个重在思维,代码很短的东西 后来...我学了BSGS,学了EXBSGS,学了模质数的K次剩余--代码一个 ...

  2. CF1106F Lunar New Year and a Recursive Sequence 线性递推 + k次剩余

    已知\(f_i = \prod \limits_{j = 1}^k f_{i - j}^{b_j}\;mod\;998244353\),并且\(f_1, f_2, ..., f_{k - 1} = 1 ...

  3. 第三次作业——K米评测

    第一部分 调研,评测 1.第一次上手体验 其实让我下载一个APP并且长期使用它是一件特别难的事情,不仅是因为占空间,需要注册个人信息,绑定账号,更是因为每款软件的功能虽然都很齐全,但是你并在没有真正用 ...

  4. 统计学习三:1.k近邻法

    全文引用自<统计学习方法>(李航) K近邻算法(k-nearest neighbor, KNN) 是一种非常简单直观的基本分类和回归方法,于1968年由Cover和Hart提出.在本文中, ...

  5. 统计学习三:2.K近邻法代码实现(以最近邻法为例)

    通过上文可知k近邻算法的基本原理,以及算法的具体流程,kd树的生成和搜索算法原理.本文实现了kd树的生成和搜索算法,通过对算法的具体实现,我们可以对算法原理有进一步的了解.具体代码可以在我的githu ...

  6. 系统服务监控指标--load、CPU利用率、磁盘剩余空间、磁盘I/O、内存使用情况等

    介绍 大型互联网企业的背后,依靠的是成千上万台服务器日夜不停的运转,以支撑其业务的运转.宕机对于互联网企业来说,代价是沉重的,轻则影响用户体验,重则直接影响交易,导致交易下跌,并且给企业声誉造成不可挽 ...

  7. 如何获取JavaCard剩余空间

    0x01应用场景 获取JavaCard卡内剩余空间,一方面是在评估一张卡的时候需要用到,另一方面是在应用个人化或者运行时需要用到. 例如:应用提供商为了保证自己的应用在卡内运行期间能够不受空间影响,一 ...

  8. JavaScript剩余操作符Rest Operator

    本文适合JavaScript初学者阅读 剩余操作符 之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符.剩余操作符和展开操作符的表示方式一样,都是三个点 ...

  9. android计算每个目录剩余空间丶总空间以及SD卡剩余空间

    ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...

随机推荐

  1. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  2. css样式之border-image

    border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...

  3. Android之网络数据存储

    一.网络保存数据介绍 可以使用网络来保存数据,在需要的时候从网络上获取数据,进而显示在App中. 用网络保存数据的方法有很多种,对于不同的网络数据采用不同的上传与获取方法. 本文利用LeanCloud ...

  4. 【Star CCM+实例】开发一个简单的计算流程.md

    流程开发在CAE过程中处于非常重要的地位. 主要的作用可能包括: 将一些经过验证的模型隐藏在流程中,提高仿真的可靠性 将流程封装成更友好的界面,降低软件的学习周期 流程开发实际上需要做非常多的工作,尤 ...

  5. 把int*传值给char*,打印出错误的数字

    首先进入debug模式查看i的地址也就是ptr的值 以16进制位小端模式存储(一个整型四个字节,8位16进制数)(根据系统位数情况) 紧接着因为ptr是char*型指针变量,读取数据时按照一个字节一个 ...

  6. iOS开发系列--地图与定位

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个 ...

  7. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  8. 新手如何在gdb中存活

    网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...

  9. 如何扩展 Visual Studio 编辑器

    在 Visual Studio 2010 的时代,扩展 Visual Studio 的途径有很多,开发者可以选择宏.Add-in.MEF 和 VSPackages 进行自定义的扩展.但是宏在 Visu ...

  10. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...