1. 程式人生 > >Timus 1132 Square Root(二次剩餘)

Timus 1132 Square Root(二次剩餘)

#include<cstdio>
#include<cstdlib>
#include<algorithm>

using namespace std;

typedef long long LL;

int w;

struct T
{
    int p,d;
};

int mod(LL a,int p)
{
    a%=p;
    if(a<0) a+=p;
    return a;
}

int Pow(int a,int b,int p)
{
    int res=1;
    for
(;b;a=1LL*a*a%p,b>>=1) if(b&1) res=1LL*res*a%p; return res; } //求勒讓德符號 int Legendre(int a,int p) { return Pow(a,p-1>>1,p); } //二次域上的乘法 T mul(T a,T b,int p) { T ans; ans.p=(1LL*a.p*b.p%p+1LL*a.d*b.d%p*w%p)%p; ans.d=(1LL*a.p*b.d%p+1LL*a.d*b.p%p)%p;
return ans; } //二次域上的快速冪 T power(T a,int b,int p) { T ans; ans.p=1; ans.d=0; for(;b;a=mul(a,a,p),b>>=1) if(b&1) ans=mul(ans,a,p); return ans; } int solve(int n,int p) { if(p==2) return 1; if(Legendre(n,p)+1==p) return -1; int a; LL t;
while(1) { a=rand()%p; t=1LL*a*a-n; w=mod(t,p); if(Legendre(w,p)+1==p) break; } T tmp; tmp.p=a; tmp.d=1; T ans=power(tmp,p+1>>1,p); return ans.p; } int main() { int t; scanf("%d",&t); int n,p; int a,b; while(t--) { scanf("%d%d",&n,&p); n%=p; a=solve(n,p); if(a==-1) { puts("No root"); continue; } b=p-a; if(a>b) swap(a,b); if(a==b) printf("%d\n",a); else printf("%d %d\n",a,b); } }

相關推薦

Timus 1132 Square Root(剩餘

#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef long long LL; int w; struct T {

Timus 1132 Square Root(剩餘 解法2

#include<cstdio> using namespace std; int Pow(int a,int b,int p) { int res=1; for(;b;a=1LL*a*a%p,b>>=1) if(b&1)

2018.12.19【Timus1132】Square Root(模奇質數剩餘(Cipolla

傳送門 解析: 這道題由於模數一定是質數,所以我們只需要特判掉模數為2的情況,剩下的就是模奇質數二次剩餘了。 關於二次剩餘可以看我的部落格 程式碼: #include<bits/stdc++.h> using namespace std; #d

2018.12.30【NOIP訓練】【SCOI2018】Numazu 的蜜柑(剩餘

題面傳送門 解析: 直接解方程可以得到 a u

[求解剩餘 數論技巧 隨機化] Ural 1132 Square Root

今天要討論的問題是解方程,其中是奇質數。 引理: 證明:由費馬小定理, 引理:方程有解當且僅當 定理:設滿足不是模的二次剩餘,即無解,那麼是二次      剩餘方程的解。

DZY Loves Fibonacci Numbers CodeForces - 446C (剩餘+線段樹維護等比數列

二次剩餘:   斐波那契通項公式: 先打表求出根號5在模1e9+9意義下的數。 然後就化簡成立區間加上等比數列的形式,維護每段區間加了多少次等比數列就行。 下面我們來看如何維護一個等比數列。假如我對區間[L,R]的加上1,2,4,8...2^n

BZOJ5104 Fib數列(剩餘+BSGS

  5在1e9+9下有二次剩餘,那麼fib的通項公式就有用了。   已知Fn,求n。注意到[(1+√5)/2]·[(1-√5)/2]=-1,於是換元,設t=[(1+√5)/2]n,原式變為√5·Fn=t-(-1)n·t-1。同乘t並移項,可得t2-√5·Fn·t-(-1)n=0。討論n的奇偶性,BSGS求二

hdu 3589 Jacobi symbol (剩餘勒讓德符號

題目連結 題意:交代一下勒讓德符號與二次剩餘,然後告訴你J(a,n)與L的關係,給定a,n,求J(a,n)。 二次剩餘的原理我並沒有搞太懂= =,想著畢竟不常見,會用板子就好了。在知道如何求勒讓德符號的情況下,只需要將n分解質因數,假設n=p1^k1 * p2^k2 *

BZOJ 5104 Fib數列(剩餘+BSGS

斐波那契數列的通項: \[\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})-(\frac{1-\sqrt{5}}{2}))\] 設T=\(\sqrt{5}*N\),\(y=\frac{\sqrt{5}+1}{2}\) 原式可化為\(y^n-(-\frac{1}{y}^n) \

cdqz2017-test1-數論 (BSGS + 剩餘 + CRT

#include<map> #include<cmath> #include<cstdio> #include<iostream> using namespace std; map<int,int>mp; int Pow(

3月12日 剩餘(shanks解法

演算法原理請wiki:Tonelli–Shanks algorithm,迅速深入理解是不太可能的,與cipola演算法相比,shanks解法更數論一點。 (這個演算法是正常的,但是還是tle) 大概

JMeter後置處理器使用詳解(開發

一、外掛下載地址: 百度網盤連結:https://pan.baidu.com/s/1WK7FVzq_PYYd2JEGX92rvQ 提取碼:shnw 二、使用條件 1.JMeter版本為3.3(在JMeter3.3的基礎上開發); 2.將jar包放置到目錄…\lib\ext下重啟J

Ueditor 百度富文字框的使用(渲染其他的在文件中都有

富文字編輯器有很多。好用的,不好用的,功能簡單的,功能複雜的。 現在,我選擇的是百度的UEditor編輯器。這個編輯器的唯一有點就是功能多。比kindeditor 這些編輯器的功能要多。當然,像layui 提供的富文字框我沒有用,所以,現在不能拿來對比。因為當初想要用layui的時候,我套了一下

側滑(點選條目進行跳轉+點選更換頭像(取樣+ViewPager

1.Layout佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk

Spark:高階排序(排序

為了多維的排序,需要考慮多個條件,這要求我們自定義key 1 23 3 22 3 31 1 12 2 11 4 45 二、使用java實現 2.1、自定義key 使用scala.math.Ordered介面,實現Serializable介面 package com.

ApolloStudio高手之路(4:用Python以最輕便的方式進行金橙子鐳射打標板卡開發(以EzCad2為載體開發

鐳射打標是以高密度、高能量的鐳射束對各種材質媒介(塑料,布匹,金屬,陶瓷等等)進行表面區域性照射加工,使表層材料汽化或發生顏色變化的化學反應,從而留下永久性標記的一種清潔環保的表面加工方法。鐳射打標可以打出各種文字、符號和圖案等,字元大小可以從毫米到微米量級,這對產品的防偽有特殊的意義。正是因為

poj 1755 Triathlon (半平面交解一元不等式(切割求半平面交

  題目連結:哆啦A夢傳送門 參考連結:https://blog.csdn.net/acm_cxlove/article/details/7883370 半平面交模板 題目:鐵人三項,每個人在某一項中有確定的速度,裁判可以決定某一項比賽的路程為多少,問對於某個人,是否存

【模板】【證明】任意模數下的剩餘求解

什麼是二次剩餘問題 就是求解形如 x 2

HashTable雜湊表/散列表(線性探測和探測

HashTable的簡單介紹 HashTable是根據關鍵字直接訪問在記憶體儲存的資料結構。 HashTable叫雜湊表或者散列表。 它通過一個關鍵值的函式將所需的資料直接對映到表中的位置來訪問資料,這個對映函式叫雜湊函式(雜湊函式),存放記錄的陣列叫散列