AOJ2048 Everlasting...?
問題リンク Everlasting...?
- 概要
2つの整数A, Bが与えられる。これらの整数のKey numberをKa, Kbとしたとき、Kb < Kaなら "a"、そうでないなら"b"と答えよ。整数nのKey numberとは、nの最大の素因数から、それ以外のnの素因数の総和を引いたものをいう。
2 <= A, B <= 10^6
- 解法
AとBを素因数分解してkey numberを計算するだけです。
- ソース
import java.util.Arrays; import java.util.Scanner; import java.util.SortedSet; import java.util.TreeSet; //Everlasting...? public class AOJ2048 { void run(){ Scanner sc = new Scanner(System.in); int N = 1000001; boolean[] p = new boolean[N]; Arrays.fill(p, true); p[0]=p[1]=false; for(int i=2;i<N;i++){ if(p[i])for(int j=i+i;j<N;j+=i)p[j]=false; } while(true){ int a = sc.nextInt(); int b = sc.nextInt(); if((a|b)==0)break; SortedSet<Integer> sa = new TreeSet<Integer>(); SortedSet<Integer> sb = new TreeSet<Integer>(); int k = 2; while(a>1){ if(p[k]&&a%k==0){ a/=k; sa.add(k); } else k++; } k = 2; while(b>1){ if(p[k]&&b%k==0){ b/=k; sb.add(k); } else k++; } int pa = sa.last(); sa.remove(pa); int pb = sb.last(); sb.remove(pb); for(int x:sa)pa-=x; for(int x:sb)pb-=x; System.out.println(pa>pb?"a":"b"); } } public static void main(String[] args) { new AOJ2048().run(); } }