2242: [SDOI2011]計算器
Time Limit: 10 Sec Memory Limit: 512 MB Submit: 3419 Solved: 1341 [Submit][Status][Discuss] Description
你被要求設計一個計算器完成以下三項任務: 1、給定y,z,p,計算Y^Z Mod P 的值; 2、給定y,z,p,計算滿足xy≡ Z ( mod P )的最小非負整數; 3、給定y,z,p,計算滿足Y^x ≡ Z ( mod P)的最小非負整數。 Input
輸入包含多組數據。 第一行包含兩個正整數T,K分別表示數據組數和詢問類型(對于一個測試點內的所有數據,詢問類型相同)。 以下行每行包含三個正整數y,z,p,描述一個詢問。 Output
對于每個詢問,輸出一行答案。對于詢問類型2和3,如果不存在滿足條件的,則輸出“Orz, I cannot find x!”,注意逗號與“I”之間有一個空格。 Sample Input
【樣例輸入1】 3 1 2 1 3 2 2 3 2 3 3 【樣例輸入2】 3 2 2 1 3 2 2 3 2 3 3 【數據規模和約定】 對于100%的數據,1<=y,z,p<=10^9,p為質數,1<=T<=10。 Sample Output
【樣例輸出1】 2 1 2 【樣例輸出2】 2 1 0
數學の特定のテ-マは本當に恐ろしいquq… 這個題的話能算是一個綜合題吧,三個操作對應著不同的算法。 對于第一個操作,比較簡單,快速冪。 對于第二個操作,可以選擇用擴展歐幾里得解這個同余方程。但是我們注意到p為質數,可以使用費馬小定理求解。首先考慮有沒有解,如果y%p==0而z%p!=0的話,很顯然Orz(這時無論x等于多少左邊余數都為0)。之后我們用費馬小定理求解,我就不講了因為我也不會 我們可以用BSGS/離散對數算法(我會告訴你我一個也不會?)。稍微介紹一下BSGS算法的思路。 網上的許多題解中,是將
(摘自hzwer)
但是這道題可以使用另一種方法稍作簡化,可以省去求逆元的步驟(你tm不會玩逆元就直說!!!)。 我們可以設
唔…這個奇妙的方法我是真的沒懂,有沒有神犇愿意給我講一講quq…
#include <cstdio>#include <algorithm>#include <map>#include <cmath>using namespace std;typedef long long LL;LL x,y,p,m,z;int T,flag;map <LL,LL> ma;LL power(LL b,LL p,LL k){ LL ans = 1; while(p){ if(p & 1) ans = (ans*b)%k; b = (b*b)%k; p >>= 1; } return ans;}void Bsgs(LL y,LL z,LL p){ int flag = 0; if(y == 0 && z == 0) {puts("1");return;} if(y == 0 && z != 0) {puts("Orz, I cannot find x!");return;} ma.clear(); LL tmp = 0,m=sqrt(p); for(LL i=0;i<=m;i++){ if(i == 0) {tmp = z%p;ma[tmp]=i;continue;} tmp = (tmp*y)%p; ma[tmp] = i; } LL t = power(y,m,p); tmp = 1; for(LL i=1;i*i<=p;i++){ tmp = (tmp*t)%p; if(ma[tmp]){ LL ans = (i*m)-ma[tmp];新聞熱點
疑難解答