This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> pi;
int inv[100005], mod;
vector<vector<int>> aug;
vector<int> sol;
void solve(){
vector<int> basis[4];
vector<int> sol2 = {0, 0, 0, 0};
for(int i=0; i<4; i++){
bool ok = 0;
for(int j=0; j<4; j++){
if(aug[i][j]){
if(basis[j].empty()){
basis[j] = aug[i];
sol2[j] = sol[i];
ok = 1;
break;
}
else{
int c = mod - 1ll * aug[i][j] * inv[basis[j][j]] % mod;
for(int k=0; k<4; k++){
aug[i][k] += 1ll * c * basis[j][k] % mod;
aug[i][k] %= mod;
}
sol[i] += 1ll * c * sol2[j] % mod;
sol[i] %= mod;
}
}
}
if(!ok && sol[i]){
puts("0 0 0 0");
return;
}
}
for(int i=3; i>=0; i--){
if(!basis[i].empty()){
for(int j=i+1; j<4; j++){
sol2[i] += mod - 1ll * basis[i][j] * sol2[j] % mod;
sol2[i] %= mod;
}
sol2[i] = 1ll * sol2[i] * inv[basis[i][i]] % mod;
}
}
for(int i=0; i<4; i++){
printf("%d ", sol2[i]);
}
puts("");
}
lint ipow(lint x, lint p){
lint ret = 1, piv = x % mod;
while(p){
if(p&1) ret *= piv;
piv *= piv;
ret %= mod;
piv %= mod;
p >>= 1;
}
return ret % mod;
}
int main(){
int t;
cin >> mod >> t;
for(int i=1; i<mod; i++) inv[i] = ipow(i, mod-2);
while(t--){
int a, b, c, d;
scanf("%d %d %d %d",&a,&b,&c,&d);
aug = {{a, -b, -c, -d}, {b, a, -d, c}, {c, d, a, -b}, {d, -c, b, a}};
sol = {1, 0, 0, 0};
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
aug[i][j] += mod;
aug[i][j] %= mod;
}
}
solve();
}
}
Compilation message (stderr)
Q.cpp: In function 'int main()':
Q.cpp:74:35: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d %d",&a,&b,&c,&d);
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |