Official

D - Prime Sum Game Editorial by kyopro_friends


あらかじめエラトステネスの篩などを用いて \(200\) 以下の素数を求めておくことで、ある数が素数であるかどうかの判定は \(O(1)\) でできるとしてよいです。

高橋君が勝つための必要十分条件は「ある数 \(X\) が存在して、高橋君が \(X\) を選ぶと、青木君がどんな数を選んでも合成数しか作れない」です。そのような \(X\) が存在するか判定しましょう。

実装例(Python)

prime=[True]*201
prime[0]=False
prime[1]=False
for p in range(15):
  if prime[p]:
    for i in range(p*p,201,p):
      prime[i]=False

A,B,C,D=map(int,input().split())
for x in range(A,B+1):
  if all(not prime[x+y] for y in range(C,D+1)):
    print("Takahashi")
    exit()
print("Aoki")

実装例(C)

#include<stdio.h>

int prime[210];
int main(){
	for(int i=2;i<=200;i++)prime[i]=1;
	for(int p=2;p*p<=200;p++)if(prime[p])for(int i=p*p;i<=200;i+=p)prime[i]=0;
	
	int a,b,c,d;
	scanf("%d%d%d%d",&a,&b,&c,&d);
	for(int x=a;x<=b;x++){
		int flag=1;
		for(int y=c;y<=d;y++)flag&=!prime[x+y];
		if(flag){
			puts("Takahashi");
			return 0;
		}
	}
	puts("Aoki");
}

Bonus: \(A,B,C,D\) の上限が \(10^5\) であるような問題が \(10^5\) ケース与えられるので解いてください (500点相当?)

posted:
last update: