結果
| 問題 | No.321 (P,Q)-サンタと街の子供たち |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-05-21 15:10:55 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 821 ms / 2,000 ms |
| コード長 | 2,965 bytes |
| コンパイル時間 | 1,996 ms |
| コンパイル使用メモリ | 77,340 KB |
| 実行使用メモリ | 69,152 KB |
| 最終ジャッジ日時 | 2024-07-06 22:13:30 |
| 合計ジャッジ時間 | 23,407 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 41 |
ソースコード
package yukicoder;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
new Main().solve();
}
void solve(){
Scanner sc=new Scanner(System.in);
int p=sc.nextInt();
int q=sc.nextInt();
int n=sc.nextInt();
long[] x=new long[n];
long[] y=new long[n];
if(p==0&&q==0){
int ret=0;
for(int i=0;i<n;i++){
x[i]=sc.nextInt();
y[i]=sc.nextInt();
if(x[i]==0&&y[i]==0)ret++;
}
System.out.println(ret);
return;
}
if(p==0){
int ret=0;
for(int i=0;i<n;i++){
x[i]=sc.nextInt();
y[i]=sc.nextInt();
if(x[i]%q==0&&y[i]%q==0)ret++;
}
System.out.println(ret);
return;
}else if(q==0){
int ret=0;
for(int i=0;i<n;i++){
x[i]=sc.nextInt();
y[i]=sc.nextInt();
if(x[i]%p==0&&y[i]%p==0)ret++;
}
System.out.println(ret);
return;
}
long gcd=gcd(Math.abs(p),Math.abs(q));
for(int i=0;i<n;i++){
x[i]=sc.nextInt();
y[i]=sc.nextInt();
}
p/=gcd;q/=gcd;
if(p%2==0||q%2==0){
int ret=0;
for(int i=0;i<n;i++){
if(x[i]%gcd==0&&y[i]%gcd==0)ret++;
}
System.out.println(ret);
}
else{
int ret=0;
for(int i=0;i<n;i++){
if(x[i]%gcd==0&&y[i]%gcd==0){
x[i]/=gcd;
y[i]/=gcd;
if((x[i]+y[i])%2==0)ret++;
}
}
System.out.println(ret);
}
/*
* 座標x,yがそれぞれ
* x=P(n+l)+Q(m+k)
* y=Q(n-l)+P(m-k)
* (n,mは任意の整数)の形で表すことができるなら、プレゼントが配られる。
* ここで、Pn+Qmはgcd(P,Q)*整数という形ですべて尽くされ、両者の表す整数の集合は一致する。
* よって、問題は、座標x,yが両方gcd(P,Q)で割り切れるものについてのみ考えればよい。
* P,Qをそれぞれgcd(P,Q)で割ったものをp,qと置く。x,yもgcdで割ってあるとする。
* ここで、(2P,0),(2Q,0)には必ずたどり着けることに注意する。すると、訪れることが可能な点から、
* x,yにそれぞれ任意の偶数を加えた点にも移動できることが分かる。
* よって(1,1),(1,0)に到達できるかのみ調べればよい。
* ①x=1=pn+qm
* ②1or0=qn+pm+(任意の偶数)
* これを満たすある整数k,l,m,nが存在すればよい。
* ①は必ず存在する。
* pが奇数,qが偶数のとき、mが偶数で、nは偶奇どちらの形にすることもできる。このとき②は1,0どちらも取れる。
* p,qが両方奇数の時、m,nの一方は奇数でもう一方は偶数。このとき、②は1しか取れない。
* よって(p+q)mod 2=0のとき、カラマツ模様に移動でき、
* p+q mod 2=1 のとき、すべての点に移動できる。
*
*/
}
long lcm(long t1,long t2){
long a=gcd(t1,t2);
long tt1=t1/a;
long tt2=t2/a;
return tt1*tt2*a;
}
long gcd(long t1,long t2){
if(t1<t2){
long d=t2;
t2=t1;
t1=d;
}
if(t2==0)return t1;
return gcd(t2,t1%t2);
}
}