結果
| 問題 |
No.551 夏休みの思い出(2)
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2019-10-26 15:36:40 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 93 ms / 4,000 ms |
| コード長 | 1,887 bytes |
| コンパイル時間 | 2,395 ms |
| コンパイル使用メモリ | 110,584 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-14 09:26:32 |
| 合計ジャッジ時間 | 5,188 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 47 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <time.h>
#include <stack>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
ll powmod(ll a, ll k, ll mod){
ll ap=a, ans=1;
while(k){
if(k&1){
ans*=ap;
ans%=mod;
}
ap=ap*ap;
ap%=mod;
k>>=1;
}
return ans;
}
ll inv(ll a, ll mod){
return powmod(a, mod-2, mod);
}
ll modsqrt(int p, int a){
if(a==0) return 0;
int q=p-1, s=0;
while((q&1)==0){
q>>=1;
s++;
}
int z=2;
while(1){
if(powmod(z, (p-1)/2, p)==p-1) break;
z++;
}
ll c=powmod(z, q, p);
ll r=powmod(a, (q+1)/2, p), t=powmod(a, q, p);
int m=s;
while(t>1){
ll tp=t;
int k=-1;
for(int i=1; i<m; i++){
tp=tp*tp%p;
if(tp==1){
k=i; break;
}
}
if(k==-1) return -1;
ll cp=c;
for(int i=0; i<m-k-1; i++) cp=cp*cp%p;
c=cp*cp%p;
t=c*t%p;
r=cp*r%p;
m=k;
}
return r;
}
int main()
{
ll p, r;
cin>>p>>r;
int q;
cin>>q;
for(int i=0; i<q; i++){
ll a, b, c;
cin>>a>>b>>c;
ll ainv=inv(a, p);
(b*=ainv)%=p;
(c*=ainv)%=p;
(b*=((p+1)/2))%=p;
ll d=(b*b+p-c)%p;
ll e=modsqrt(p, d);
if(e==-1){
cout<<-1<<endl;
}else{
ll x1=(e-b+p)%p, x2=(-e-b+2*p)%p;
if(x1==x2){
cout<<x1<<endl;
}else{
if(x1>x2) swap(x1, x2);
cout<<x1<<" "<<x2<<endl;
}
}
}
return 0;
}
chocorusk