Submission #33033


Source Code Expand

#include<cstdio>
#include<algorithm>
#include"porter.h"

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

typedef long long ll;

const ll INF=1LL<<61;

template<class T>
class gint{
public:
	T a,b; // a+bi
	gint(const T &a=0,const T &b=0):a(a),b(b){}

	gint &operator+=(const gint &z){ a+=z.a; b+=z.b; return *this; }
	gint &operator-=(const gint &z){ a-=z.a; b-=z.b; return *this; }
	gint &operator*=(const gint &z){
		gint w=*this;
		a=w.a*z.a-w.b*z.b;
		b=w.a*z.b+w.b*z.a;
		return *this;
	}
	gint &operator/=(const gint &z){ // 割り切れないときは、実部・虚部とも最も近い整数に丸める
		gint w=*this;
		T de=z.a*z.a+z.b*z.b,nu;
		bool sgn;
		nu=w.a*z.a+w.b*z.b; sgn=(nu>=0); if(!sgn) nu*=-1; a=nu/de+(nu%de<=de/2?0:1); if(!sgn) a*=-1;
		nu=w.b*z.a-w.a*z.b; sgn=(nu>=0); if(!sgn) nu*=-1; b=nu/de+(nu%de<=de/2?0:1); if(!sgn) b*=-1;
		return *this;
	}
	gint &operator%=(const gint &z){ return *this-=*this/z*z; }

	gint operator+(const gint &z)const{ return gint(*this)+=z; }
	gint operator-(const gint &z)const{ return gint(*this)-=z; }
	gint operator*(const gint &z)const{ return gint(*this)*=z; }
	gint operator/(const gint &z)const{ return gint(*this)/=z; }
	gint operator%(const gint &z)const{ return gint(*this)%=z; }

	gint operator-()const{ return gint(-a,-b); }

	bool operator==(const gint &z)const{ return a==z.a && b==z.b; }
	bool operator!=(const gint &z)const{ return a!=z.a || b!=z.b; }
};

template<class T>
T xgcd(T a,T b,T &x,T &y){
	if(b==0){ x=1; y=0; return a; }
	T g=xgcd(b,a%b,y,x); y-=a/b*x;
	return g;
}

int E,S;
gint<ll> P; // 現在位置

void init(int E,int S){
	::E=E;
	::S=S;
	P.a=P.b=0;
}

int moveTo(int tx,int ty,int A,int B){
	int dx[]={0,1,0,-1,0},dy[]={0,0,1,0,-1};
	
	// pos = x*(A+Bi) + y*(E+Si)
	gint<ll> pos=gint<ll>(tx,ty)-P;

	// n := gcd(E+Si,A+Bi) = j*(E+Si) + k*(A+Bi)
	gint<ll> n,j,k;
	n=xgcd(gint<ll>(E,S),gint<ll>(A,B),j,k);

	ll ans=-1;
	if(pos%n==0){
		gint<ll> p=pos/n;
		// x = p*k は一つの解であるが、整数の場合と同じで解はこれだけとは限らない ( mod E+Si の分の任意性がある )
		// |Re(x)|+|Im(x)| が最小となる解 x を見つける
		gint<ll> m=gint<ll>(E,S)/n,t=gint<ll>(A,B)/n;
		// 一般解は x = p*k+l*m, y = p*j-l*t ( l は任意の Gauss 整数 )
		gint<ll> l=-p*k/m;
		ans=INF;
		rep(i,5){
			l.a+=dx[i]; l.b+=dy[i];
			ans=min(ans,llabs((p*k+l*m).a)+llabs((p*k+l*m).b));
			l.a-=dx[i]; l.b-=dy[i];
		}
	}

	P=gint<ll>(tx,ty);

	return ans;
}

Submission Info

Submission Time
Task C - ポーター・テレ・ポーター (Porter-Tele-Porter)
User fura2
Language IOI-Style C++ (GCC 5.4.1)
Score 100
Code Size 2586 Byte
Status AC
Exec Time 271 ms
Memory 3144 KB

Judge Result

Set Name Subtask1 Subtask2 Subtask3
Score / Max Score 21 / 21 27 / 27 52 / 52
Status
AC × 9
AC × 18
AC × 27
Set Name Test Cases
Subtask1 subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask1/8, subtask1/9
Subtask2 subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask1/8, subtask1/9, subtask2/1, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6, subtask2/7, subtask2/8, subtask2/9
Subtask3 subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask1/8, subtask1/9, subtask2/1, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6, subtask2/7, subtask2/8, subtask2/9, subtask3/1, subtask3/2, subtask3/3, subtask3/4, subtask3/5, subtask3/6, subtask3/7, subtask3/8, subtask3/9
Case Name Status Exec Time Memory
subtask1/1 AC 94 ms 1096 KB
subtask1/2 AC 29 ms 1120 KB
subtask1/3 AC 27 ms 1104 KB
subtask1/4 AC 27 ms 1096 KB
subtask1/5 AC 28 ms 1100 KB
subtask1/6 AC 27 ms 1104 KB
subtask1/7 AC 29 ms 1088 KB
subtask1/8 AC 30 ms 1152 KB
subtask1/9 AC 29 ms 1104 KB
subtask2/1 AC 28 ms 1100 KB
subtask2/2 AC 28 ms 1104 KB
subtask2/3 AC 28 ms 1144 KB
subtask2/4 AC 30 ms 1116 KB
subtask2/5 AC 30 ms 1112 KB
subtask2/6 AC 27 ms 1096 KB
subtask2/7 AC 27 ms 1104 KB
subtask2/8 AC 28 ms 1104 KB
subtask2/9 AC 28 ms 1100 KB
subtask3/1 AC 221 ms 2888 KB
subtask3/2 AC 202 ms 2892 KB
subtask3/3 AC 228 ms 2884 KB
subtask3/4 AC 256 ms 2880 KB
subtask3/5 AC 235 ms 3008 KB
subtask3/6 AC 241 ms 3016 KB
subtask3/7 AC 221 ms 3016 KB
subtask3/8 AC 262 ms 3008 KB
subtask3/9 AC 271 ms 3144 KB