因为C题卡住了,这次炸了.
我以为模拟肯定T了,所以就写了拓展欧几里得.
然后就被欧几里得坑了.
用拓展欧几里得做,要把横向和纵向运动分开.
x轴:
f(x)=t%2n,2n−t%2n
y轴:
f(x)=t%2m,2m−t%2m
然后把这两个公式展开一下,在拓展欧几里得求一下就完事了.
(调试出翔)
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long longl;
const longl INF=1LL<<60;
template <class T> void put(T x) {
if (x==0) {
return;
}
put(x/10);
putchar(x%10^48);
}
template <class T> void print(T x) {
if (x<0) {
putchar('-'),x=-x;
} else if (x==0) {
putchar('0');
return;
}
put(x);
}
int exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1;y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
longl t=x;x=y;y=t-1LL*a/b*y;
return r;
}
int N,M;
int n,m,k;
int x,y,gcd;
longl solve(int a,int b) {
if ((b-a)%gcd) return INF;
int t=(b-a)/gcd;
longl k=1LL*x*t;
k=(k%m+m)%m;
return 2LL*N*k+a;
}
int main() {
int n,m,k;
cin>>n>>m>>k;
N=n,M=m;
n<<=1,m<<=1;
gcd=exgcd(n,m,x,y);
n/=gcd,m/=gcd;
::n=n,::m=m;
exgcd(n,m,x,y);
for (int a,b,i=1;i<=k;++i) {
longl t=INF;
scanf("%d%d",&a,&b);
t=min(t,solve(a,b));
t=min(t,solve(a,2*M-b));
t=min(t,solve(2*N-a,b));
t=min(t,solve(2*N-a,2*M-b));
if (t==INF) puts("-1");
else print(t),putchar('\n');
}
return 0;
}