日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P5491-[模板]二次剩余

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P5491-[模板]二次剩余 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P5491


題目大意

求解x2=N(modP)x^2=N(mod\ \ P)x2=N(mod??P)


解題思路

aaa在模ppp意義下可以開根那么aaa就是ppp的二次剩余,定義
(ap)={1(a是p的二次剩余)?1(a是p的二次非剩余)0(p∣a)\binom{a}{p}=\left\{\begin{matrix}1(a是p的二次剩余)\\-1(a是p的二次非剩余)\\0(p|a)\end{matrix}\right.(pa?)=????1(ap)?1(ap)0(pa)?

那么如果gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1就有(ap)=ap?12\binom{a}{p}=a^{\frac{p-1}2{}}(pa?)=a2p?1?

如果我們求x2=N(modp)x^2=N(\mod p)x2=N(modp)那么我們考慮先求一個(a2?N)p?12=?1(a^2-N)^{\frac{p-1}{2}}=-1(a2?N)2p?1?=?1,然后定義ω=a2?N\omega=\sqrt{a^2-N}ω=a2?N?,那么就有定理x=(a+ω)p+12x=(a+\omega)^{\frac{p+1}{2}}x=(a+ω)2p+1?,這里我們找aaa的時候只要隨機就好了,因為ppp的二次有p+12\frac{p+1}{2}2p+1?個,期望很快就能找到一個合法的aaa


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll T,n,p,k,w; struct complex{complex(ll xx=0,ll yy=0){x=xx;y=yy;}ll x,y; }; complex operator+(complex &a,complex &b) {return complex((a.x+b.x)%p,(a.y+b.y)%p);} complex operator-(complex &a,complex &b) {return complex((a.x-b.x+p)%p,(a.y-b.y+p)%p);} complex operator*(complex &a,complex &b) {return complex((a.x*b.x%p+a.y*b.y%p*w%p+p)%p,(a.x*b.y+a.y*b.x)%p);} complex poweri(complex x,ll b){complex ans=complex(1,0);while(b){if(b&1)ans=ans*x;x=x*x;b>>=1; }return ans; } ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans; } bool check(ll a) {return power(((a*a%p-n)%p+p)%p,k)==(p-1);} int main() {srand(31958);scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&p);if(!n){printf("0\n");continue;}if(p==2){printf("%lld\n",n);continue;}k=(p-1)>>1;if(power(n,k)==p-1){printf("Hola!\n");continue;}ll a=rand()%p;while(!check(a))a=rand()%p;w=((a*a%p-n)%p+p)%p;ll x1=poweri(complex(a,1),(p+1)/2).x;ll x2=p-x1;if(x1>x2)swap(x1,x2);if(x1!=x2)printf("%lld %lld\n",x1,x2);else printf("%lld\n",x1);} }

總結

以上是生活随笔為你收集整理的P5491-[模板]二次剩余的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。