AOJ2150 Matsuzaki Number
問題リンク Matsuzaki Number
- 解法
Nより大きな素数の組み合わせの和を十分多く求めてその中でP番目の大きさのものを探す方針です。
大きさ150000程度までの素数を求めておきます(150000は適当です)。
Nより大きい最小の素数がk番目の素数だとします。k 〜 k+P番目の素数の組み合わせの和を全て求めます。ソートして、P番目のものが答えとなります。
- ソース
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Scanner; //Matsuzaki Number public class AOJ2150 { void run(){ int N = 150000; Scanner sc = new Scanner(System.in); boolean[] p = new boolean[N]; Arrays.fill(p, true); List<Integer> l = new ArrayList<Integer>(); p[0]=p[1]=false; for(int i=2;i<N;i++){ if(p[i]){ l.add(i); for(int j=i+i;j<N;j+=i)p[j]=false; } } for(;;){ int n = sc.nextInt(), P = sc.nextInt(); if(n==-1&&P==-1)break; List<Integer> res = new ArrayList<Integer>(); int k=0; while(l.get(k)<=n)k++; for(int i=k;i<k+P;i++)for(int j=i;j<k+P;j++)res.add(l.get(i)+l.get(j)); Collections.sort(res); System.out.println(res.get(P-1)); } } public static void main(String[] args) { new AOJ2150().run(); } }