[模板]二次剩余(无讲解)

Posted greenduck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板]二次剩余(无讲解)相关的知识,希望对你有一定的参考价值。

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long int ll;
 4 typedef unsigned long long int ull;
 5 ull SEED=1;
 6 ll n,mod;
 7 ll w;
 8 struct com
 9 {
10     ll x,y;
11     com operator*(const com&A)const
12     {
13         com B;
14         B.x=(x*A.x+y*A.y%mod*w)%mod;
15         B.y=(x*A.y+y*A.x)%mod;
16         return B;
17     }
18 };
19 inline ull R()
20 {
21     SEED^=SEED<<13;
22     SEED^=SEED>>5;
23     SEED^=SEED<<3;
24     return SEED;
25 }
26 inline ll qpow(ll x,ll y)
27 {
28     ll ans=1,base=x;
29     while(y)
30     {
31         if(y&1)
32             ans=ans*base%mod;
33         base=base*base%mod;
34         y>>=1;
35     }
36     return ans;
37 }
38 inline com qpow(com x,ll y)
39 {
40     com ans=x,base=x;
41     --y;
42     while(y)
43     {
44         if(y&1)
45             ans=ans*base;
46         base=base*base;
47         y>>=1;
48     }
49     return ans;
50 }
51 inline void solve()
52 {
53     cin>>n>>mod;
54     if(qpow(n,(mod-1)/2)==mod-1)
55     {
56         cout<<"Hola!"<<endl;
57         return;
58     }
59     ll a;
60     while(true)
61     {
62         a=R()%mod;
63         w=(a*a%mod-n+mod)%mod;
64         if(qpow(w,(mod-1)/2)==mod-1)
65             break;
66     }
67     com A;
68     A.x=a,A.y=1;
69     A=qpow(A,(mod+1)/2);
70     ll ans1=A.x;
71     ll ans2=(mod-ans1+mod)%mod;
72     if(ans1>ans2)
73         swap(ans1,ans2);
74     if(ans1==ans2)
75         cout<<ans1<<endl;
76     else
77         cout<<ans1<<" "<<ans2<<endl;
78 }
79 int main()
80 {
81     srand(time(0));
82     ios::sync_with_stdio(false);
83     int T;
84     cin>>T;
85     while(T--)
86         solve();
87     return 0;
88 }
View Code

 

以上是关于[模板]二次剩余(无讲解)的主要内容,如果未能解决你的问题,请参考以下文章

二次剩余(懒人模板总结)

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

beta版本——第二次冲刺

模板模式讲解二

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误

P4720 模板扩展卢卡斯定理/exLucas(无讲解,纯记录模板)