import java.io.*;
import java.util.*;

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
		String s = r.readLine();
		StringTokenizer st = new StringTokenizer(s," ");
		int a,b;
		while(true){
			try {
				a = Integer.parseInt(st.nextToken().toString());
				b = Integer.parseInt(st.nextToken().toString());
				a+=b;
				for(b=0;a!=0;a=a/10) {
					b++;
				}
				System.out.println(b);
				s = r.readLine();
				if (s==null) break;
				st = new StringTokenizer(s," ");
			} catch (NoSuchElementException e) {
				System.exit(0);
			}
		}
	}
}

Global OOD problem IDs are disjoint from train, validation, and in-distribution test problem IDs.

Digit Number

Write a program which computes the digit number of sum of two integers a and b.

Input

There are several test cases. Each test case consists of two non-negative integers a and b which are separeted by a space in a line. The input terminates with EOF.

Constraints

0 ≤ a, b ≤ 1,000,000

The number of datasets ≤ 200

Output

Print the number of digits of a + b for each data set.

Sample Input

5 7
1 99
1000 999

Output for the Sample Input

2
3
4

Submitted source-code file size, in bytes.

Execution CPU time reported by official Project CodeNet metadata, in milliseconds.

Peak memory usage reported by official Project CodeNet metadata, in kilobytes.


import java.io.*;
public class Main{

    public static int[] sort(String s[]){
        int[] sides = new int[s.length];
        for(int i = 0;i < s.length; i++){
            sides[i] = Integer.parseInt(s[i]);
        }
        for(int j = 1;j < sides.length; j++){
            if(sides[0] < sides[j]){
                int n = sides[0];
                sides[0] = sides[j];
                sides[j] = n;
            }
        }
        return sides;
    }
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int num = Integer.parseInt(str);
        while(num <= 0 || num > 1000){
            str = br.readLine();
            num = Integer.parseInt(str);
        }
        String str1;
        String side[][];
        side = new String[num][];
        int sides[][];
        sides = new int[num][];
        int a = 0;
        while(a != num){
            str1 = br.readLine();
            side[a] = str1.split(" ", 3);
            sides[a] = sort(side[a]);
            a++;
        }
        for(int k = 0;k < num;k++){
             if(sides[k][0]*sides[k][0] == sides[k][2]*sides[k][2] +sides[k][1]*sides[k][1]){
                System.out.println("YES");
            }else{
                System.out.println("NO");
            }
        }
    }
}

Is it a Right Triangle?

Write a program which judges wheather given length of three side form a right triangle. Print "YES" if the given sides (integers) form a right triangle, "NO" if not so.

Input

Input consists of several data sets. In the first line, the number of data set, N is given. Then, N lines follow, each line corresponds to a data set. A data set consists of three integers separated by a single space.

Constraints

1 ≤ length of the side ≤ 1,000

N ≤ 1,000

Output

For each data set, print "YES" or "NO".

Sample Input

3
4 3 5
4 3 6
8 8 8

Output for the Sample Input

YES
NO
NO


import java.util.*;

public class Main{
   public static void main(String[] args) {
	  Scanner sc =new Scanner(System.in);
int a,b;
while(sc.hasNext()){
int n1=sc.nextInt();
int n2=sc.nextInt();
a=Math.max(n1,n2);
b=Math.min(n1,n2);
for(;;){
a =a%b;
if(a==0)break;
int temp=b;
b=a;
a=temp;
}
System.out.println(b+" "+(long)n1*n2/b);
   }
   }
}

GCD and LCM

Write a program which computes the greatest common divisor (GCD) and the least common multiple (LCM) of given a and b.

Input

Input consists of several data sets. Each data set contains a and b separated by a single space in a line. The input terminates with EOF.

Constraints

0 < a, b ≤ 2,000,000,000

LCM(a, b) ≤ 2,000,000,000

The number of data sets ≤ 50

Output

For each data set, print GCD and LCM separated by a single space in a line.

Sample Input

8 6
50000000 30000000

Output for the Sample Input

2 24
10000000 150000000


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main
{
  public static void main(String[] args) throws NumberFormatException, IOException
  {
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    while (input.ready())
    {
      String[] dataStr = input.readLine().split(" ");
      int[] dataInt = new int[dataStr.length];
      for (int i = 0; i < dataStr.length; i++)
      {
        dataInt[i] = Integer.valueOf(dataStr[i]);
      }
      System.out.println(getGCD(dataInt[0], dataInt[1]) + " " + getLCM(dataInt[0], dataInt[1]));
    }
  }

  public static int getGCD(int num1, int num2)
  {
    if (num1 == num2)
      return num1;

    int a  = Math.max(num1, num2);
    int b = Math.min(num1, num2);
    int c = 1;

    while (true)
    {
      c = a % b;
      if(c == 0) {
        break;
      }
      a = b;
      b = c;
    }
    return b;
  }

  public static int getLCM(int a, int b)
  {
    int productA = a;
    int productB = b;
    while (productA <= 2000000000)
    {
      if (productA == productB)
      {
        return productA;
      }
      if (productA < productB)
      {
        productA += a;
      }
      else
      {
        productB += b;
      }
    }
    return 0;
  }
}


import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int a,b,k=1,t=1,x,y;
		int i=1,j=1;
		while(s.hasNext()){
			a=s.nextInt();
			b=s.nextInt();
			//
			k=a;t=b;
			while(true){
				if(k==t)
					break;
				if(k<t){
					k=a*i;
					i++;
				}
				if(t<k){
					t=b*j;
					j++;
				}
			}
			x=k;
			//
			i=1;j=1;k=a;t=b;
			while(true){
				if(k==t || k==1 || t==1)
					break;
				if(t<k){
					i++;
					if(a%i==0){
					k=a/i;
					}
				}
				if(k<t){
					j++;
					if(b%j==0){
					t=b/j;
					}
				}
			}
			y=k;
			System.out.println(y+" "+x);
			i=1;j=1;k=1;t=1;
		}
	}
}


import java.io.*;
class Main{

    public static void main(String[] args) throws IOException{
	int gcd,lcm;
	BufferedReader br=
	    new BufferedReader (new InputStreamReader(System.in));
	String buf;
	while(true){
	    if((buf=br.readLine())==null)break;
	    if(buf.length()==0)break;
	    String[] data=buf.split(" ");
	    int[] dat =new int[2];
	    for(int i=0;i<2;i++){
		dat[i]=Integer.parseInt(data[i]);
	    }
	    int x=dat[0],y=dat[1];
	    while(true){
		if(x==y)break;
		if(x > y) x-=y;
		else y-=x;
	    }
	    lcm=x;
	    double d=(double)dat[0]*(double)dat[1];
	    d/=(double)lcm;
	    gcd=(int)d;
	    System.out.println(lcm+" "+gcd);
	}
    }
}


import java.io.*;
public class Main {
	public static void main(String[] args) throws java.io.IOException {
		BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
		String str = input.readLine();
		int K = str.length();
		for(int a = K-1;a >= 0;a--){
			if(a==0){
				System.out.println(str.charAt(a));
			}else{
				System.out.print(str.charAt(a));
			}
		}
	}
}

Reverse Sequence

Write a program which reverses a given string str.

Input

str (the size of str ≤ 20) is given in a line.

Output

Print the reversed str in a line.

Sample Input

w32nimda

Output for the Sample Input

admin23w


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main
{

	public static void main(String[] args)throws IOException
	{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String str;
		while((str=br.readLine())!=null)
		{
			int n=Integer.parseInt(str);
			int debt=100000;
			System.out.println(debt(debt,n));

		}
	}

	static int debt(int debt,int n)
	{
		int add=(int)Math.ceil(((int)Math.round(debt*5.0/100.0))/1000.0)*1000;
		debt+=add;
		n--;
		if(n>0){return debt(debt,n);}
		else{return debt;}
	}

}

Debt Hell

Your friend who lives in undisclosed country is involved in debt. He is borrowing 100,000-yen from a loan shark. The loan shark adds 5% interest of the debt and rounds it to the nearest 1,000 above week by week.

Write a program which computes the amount of the debt in n weeks.

Input

An integer n (0 ≤ n ≤ 100) is given in a line.

Output

Print the amout of the debt in a line.

Sample Input

5

Output for the Sample Input

130000


import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args)
            throws java.io.IOException{
        Scanner scan = new Scanner(System.in);
 int sum=100000;

             for(int n=scan.nextInt();n>0;n--){
sum *=1.05;
int m= up3(sum);
if(m!=0)
sum+=1000-m;
}
System.out.println(sum);
}
public static int up3(int n){
return n%1000;

        }
}


import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String str;
		int num,count;
		while (null != (str = in.readLine())) {
			count = 0;
			num = Integer.parseInt(str);
			for (int i = 0; i <= 9; i++) {
				for (int j = 0; j <= 9; j++) {
					for (int k = 0; k <= 9; k++) {
						for (int l = 0; l <= 9; l++)
							count += (i + j + k + l == num) ? 1 : 0;
					}
				}
			}
			System.out.println(count);
		}
	}
}

Sum of 4 Integers

Write a program which reads an integer n and identifies the number of combinations of a, b, c and d (0 ≤ a, b, c, d ≤ 9) which meet the following equality:

a + b + c + d = n

For example, for n = 35, we have 4 different combinations of (a, b, c, d): (8, 9, 9, 9), (9, 8, 9, 9), (9, 9, 8, 9), and (9, 9, 9, 8).

Input

The input consists of several datasets. Each dataset consists of n (1 ≤ n ≤ 50) in a line. The number of datasets is less than or equal to 50.

Output

Print the number of combination in a line.

Sample Input

35
1

Output for the Sample Input

4
4


import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		//while(scan.hasNext()){
			int count=0;
			int n=scan.nextInt();
			int[] num = new int[51];
			for(int i=0;i<=9;i++){
				for(int j=0;j<=9;j++){
					for(int k=0;k<=9;k++){
						for(int l=0;l<=9;l++){
							num[i+j+k+l]++;
							//if((i+j+k+l)==n){
								//count++;
						}
					}
				}
			}
			while(scan.hasNext()){
				System.out.println(num[n]);
			}
	}
}


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            int n = sc.nextInt();
            int a=0;
            int b[]=new int[n+1];
            if(n < 2){
                System.out.println("0");
            }else{
            	for(int i=2;i<=n;i++){
            		if (b[i]==0){
            		  for(int j=i*2; j<=n; j = j+i){
            			  b[j]=1;
            		   }
            		  }
                  	}
                   for(int i=2; i<=n; i++){
                     if(b[i]==0)a++;

                   }
                   System.out.println(a);
            }
         }

    }
}

Prime Number

Write a program which reads an integer n and prints the number of prime numbers which are less than or equal to n. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. For example, the first four prime numbers are: 2, 3, 5 and 7.

Input

Input consists of several datasets. Each dataset has an integer n (1 ≤ n ≤ 999,999) in a line.

The number of datasets is less than or equal to 30.

Output

For each dataset, prints the number of prime numbers.

Sample Input

10
3
11

Output for the Sample Input

4
2
5


import java.io.*;
import java.util.Arrays;

public class Main{

	public static int prime[] = new int[1000];
	private static int primeCnt = 0;

	public static void main(String[] args) throws IOException{

	try{
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String str;
        while( (str = br.readLine() ) != null ){
        	System.out.printf("%d\n",countPrime(Integer.parseInt(str)));
        	Arrays.fill(prime,0);
        	primeCnt = 0;
        }
	}
	catch(Exception e){
		System.out.println(e);
	}
	}

	private static boolean isPrime(int n){

		if(n==2){
			prime[0] = 2;
			primeCnt++;
			return true;
		}

		for(int i = 0; i < prime.length ; i++) {
			if(n%prime[i] == 0){
				return false;
			}
			if(prime[i+1]==0) break;
		}
		prime[primeCnt] = n;
		primeCnt++;
		return true;
	}

	private static int countPrime(int n){
		int count = 0;
		for(int i = 2; i <= n; i++){
			if( isPrime(i) )count++;
		}
		return count;
	}

}


import java.util.Scanner;

public class Main{
    boolean[] isPrime;
    void run(){
	isPrime = new boolean[1000001];
	for(int i=0;i<=1000000;i++) isPrime[i] = true;

	isPrime[0] = false;
 	isPrime[1] = false;

	for(int i=2;i<=1000000;i++){
	    if(!isPrime[i]) continue;
	    for(int j=i+i;j<=1000000;j+=i){
		isPrime[j] = false;
	    }
	}
	Scanner sc = new Scanner(System.in);

	while(sc.hasNext()){
	    int n=sc.nextInt();
	    int count = 0;
	    for(int i=0;i<=n;i++){
		if(isPrime[i]) count++;
	    }
	    System.out.println(count);
	}
    }
    public static void main(String[] args){
	new Main().run();
    }
}


import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int w=sc.nextInt();
		int num[]=new int[w+1];
		for(int i=1;i<=w;i++){
			num[i]=i;
		}

		int n=sc.nextInt();
		for(int i=0;i<n;i++){
			String[] str=sc.next().split(",");
			int a=Integer.parseInt(str[0]);
			int b=Integer.parseInt(str[1]);
			int c=num[a];
			num[a]=num[b];
			num[b]=c;
		}

		for(int i=1;i<=w;i++){
			System.out.println(num[i]);
		}
		sc.close();
	}

}

Drawing Lots

Let's play Amidakuji.

In the following example, there are five vertical lines and four horizontal lines. The horizontal lines can intersect (jump across) the vertical lines.

In the starting points (top of the figure), numbers are assigned to vertical lines in ascending order from left to right. At the first step, 2 and 4 are swaped by the first horizontal line which connects second and fourth vertical lines (we call this operation (2, 4)). Likewise, we perform (3, 5), (1, 2) and (3, 4), then obtain "4 1 2 5 3" in the bottom.

Your task is to write a program which reads the number of vertical lines w and configurations of horizontal lines and prints the final state of the Amidakuji. In the starting pints, numbers 1, 2, 3, ..., w are assigne to the vertical lines from left to right.

Input

w
n
a1,b1
a2,b2
.
.
an,bn

w (w ≤ 30) is the number of vertical lines. n (n ≤ 30) is the number of horizontal lines. A pair of two integers ai and bi delimited by a comma represents the i-th horizontal line.

Output

The number which should be under the 1st (leftmost) vertical line

The number which should be under the 2nd vertical line

:

The number which should be under the w-th vertical line

Sample Input

5
4
2,4
3,5
1,2
3,4

Output for the Sample Input

4
1
2
5
3


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = "";

		ArrayList<StringBuilder[]> ds = new ArrayList<StringBuilder[]>();
		int n = 0;

		try {
			s = br.readLine();
			n = Integer.parseInt(s);

			for (int i = 0; i < n; i++) {
				StringBuilder[] sb = new StringBuilder[2];

				s = br.readLine();
				sb[0] = new StringBuilder(s);

				s = br.readLine();
				sb[1] = new StringBuilder(s);

				ds.add(sb);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		for (StringBuilder[] sb : ds) {
			StringBuilder sum = new StringBuilder();
			sb[0].reverse();
			sb[1].reverse();
			int len1 = sb[0].length();
			int len2 = sb[1].length();
			int len = (len1 > len2 ? len1 : len2);

			// q: 商, r: 余
			int q, r;
			q = r = 0;
			for (int i = 0; i < len + 1; i++) {

				int n1, n2;
				if (i < len1)
					n1 = Integer.parseInt(String.valueOf(sb[0].charAt(i)));
				else
					n1 = 0;
				if (i < len2)
					n2 = Integer.parseInt(String.valueOf(sb[1].charAt(i)));
				else
					n2 = 0;
				if (n1 != 0 || n2 != 0 || q != 0) {
					r = (n1 + n2 + q) % 10;
					sum.append(r);
					q = (n1 + n2 + q) / 10;
				}
			}
			if (sum.length() > 80)
				System.out.println("overflow");
			else
				System.out.println(sum.reverse());
		}
	}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String s="";
		Map<Character, Character> map=new HashMap<Character, Character>();
		//Map<Character, Character> map=new TreeMap<Character, Character>();
		for (int i = 0; i < 22; i++) {
			map.put((char)('a'+(i+4)),(char)('a'+i));
		}
		map.put('a', 'w');
		map.put('b', 'x');
		map.put('c', 'y');
		map.put('d', 'z');
		while((s=br.readLine())!=null){
			for (int i = 0; i < s.length(); i++) {
				if(map.containsKey(s.charAt(i))){
					System.out.print(map.get(s.charAt(i)));
				}else{
					System.out.print(s.charAt(i));
				}

			}
		}
	}

}

Caesar Cipher

In cryptography, Caesar cipher is one of the simplest and most widely known encryption method. Caesar cipher is a type of substitution cipher in which each letter in the text is replaced by a letter some fixed number of positions down the alphabet. For example, with a shift of 1, 'a' would be replaced by 'b', 'b' would become 'c', 'y' would become 'z', 'z' would become 'a', and so on. In that case, a text:

this is a pen

is would become:

uijt jt b qfo

Write a program which reads a text encrypted by Caesar Chipher and prints the corresponding decoded text. The number of shift is secret and it depends on datasets, but you can assume that the decoded text includes any of the following words: "the", "this", or "that".

Input

Input consists of several datasets. Each dataset consists of texts in a line. Input ends with EOF. The text consists of lower-case letters, periods, space, and end-of-lines. Only the letters have been encrypted. A line consists of at most 80 characters.

You may assume that you can create one decoded text which includes any of "the", "this", or "that" from the given input text.

The number of datasets is less than or equal to 20.

Output

Print decoded texts in a line.

Sample Input

xlmw mw xli tmgxyvi xlex m xsso mr xli xvmt.

Output for the Sample Input

this is the picture that i took in the trip.


import java.io.*;
public class Main {
	public static void main(String[] args) throws IOException {System.out.println((new Main()).fact(Integer.parseInt((new BufferedReader(new InputStreamReader(System.in))).readLine())));}
	private long fact(long n){return (n==0)?1:n*fact(n-1);}
}

Factorial

Write a program which reads an integer n and prints the factorial of n. You can assume that n ≤ 20.

Input

An integer n (1 ≤ n ≤ 20) in a line.

Output

Print the factorial of n in a line.

Sample Input

5

Output for the Sample Input

120


import java.util.Scanner;
public class Main {
	public static void main(String[] args) throws java.io.IOException {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		double x[] = new double[4];
		double y[] = new double[4];
		for(int i = 0; i < n ; i++){
			for(int j = 0 ; j < 4 ; j++){
				x[j] = scan.nextDouble();
				y[j]= scan.nextDouble();
			}
			double a= 0,b = 0;
			a = (y[1]-y[0])/(x[1]-x[0]);
			b = (y[3]-y[2])/(x[3]-x[2]);
			if(a == b){
				System.out.println("YSE");
			}else{
				System.out.println("NO");
			}
		}
	}
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Parallelism

There are four points: $A(x_1, y_1)$, $B(x_2, y_2)$, $C(x_3, y_3)$, and $D(x_4, y_4)$. Write a program which determines whether the line $AB$ and the line $CD$ are parallel. If those two lines are parallel, your program should prints "YES" and if not prints "NO".

Input

Input consists of several datasets. In the first line, you are given the number of datasets $n$ ($n \leq 100$). There will be $n$ lines where each line correspondgs to each dataset. Each dataset consists of eight real numbers:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ $x_4$ $y_4$

You can assume that $-100 \leq x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4 \leq 100$.
Each value is a real number with at most 5 digits after the decimal point.

Output

For each dataset, print "YES" or "NO" in a line.

Sample Input

2
0.0 0.0 1.0 1.0 1.0 0.0 2.0 1.0
3.0 2.0 9.0 6.0 13.0 5.0 7.0 9.0

Output for the Sample Input

YES
NO


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

		while (input.ready()) {
			int setCount = Integer.valueOf(input.readLine());
			if (setCount == 0)
				break;
			ArrayList<Integer> dataSet = new ArrayList<>();
			for (int i = 0; i < setCount; i++) {
				dataSet.add(Integer.valueOf(input.readLine()));
			}
			ArrayList<Integer> ansSet = new ArrayList<>();
			for (int i = 0; i < setCount; i++) {
				int tmp = 0;
				for (int j = i; j < setCount; j++) {
					tmp += dataSet.get(j);
					ansSet.add(tmp);
				}
			}
			Collections.sort(ansSet);
			System.out.println(ansSet.get(ansSet.size()-1));
		}
	}
}

Maximum Sum Sequence

Given a sequence of numbers a1, a2, a3, ..., an, find the maximum sum of a contiguous subsequence of those numbers. Note that, a subsequence of one element is also a contiquous subsequence.

Input

The input consists of multiple datasets. Each data set consists of:

n
a1
a2
.
.
an

You can assume that 1 ≤ n ≤ 5000 and -100000 ≤ ai ≤ 100000.

The input end with a line consisting of a single 0.

Output

For each dataset, print the maximum sum in a line.

Sample Input

7
-5
-1
6
4
9
-6
-7
13
1
2
3
2
-2
-1
1
2
3
2
1
-2
1
3
1000
-200
201
0

Output for the Sample Input

19
14
1001


import java.util.Scanner;
import java.util.ArrayList;
class Main{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		while(true){
			int n = scan.nextInt();
			if(n == 0){
				break;
			}
			if(n == 1){
				System.out.println(scan.nextInt());
				continue;
			}
			ArrayList<Integer> alist = new ArrayList<Integer>();
			int temp = scan.nextInt();
			boolean sw;
			if(temp > 0){
				sw = true;
			}else{
				sw = false;
			}
			for(int i = 0;i < n-1;i++){
				int a = scan.nextInt();
				if(a > 0){
					if(sw){
						temp += a;
					}else{
						alist.add(temp);
						temp = a;
						sw = true;
					}
				}else{
					if(sw){
						alist.add(temp);
						temp = a;
						sw = false;
					}else{
						temp += a;
					}
				}
			}
			alist.add(temp);
			int max = 0;
			int b = 0;
			for(int i = alist.size()-1;i >= 0;i--){
				temp = alist.get(i);
				if(max < temp + b){
					max = temp + b;
				}
				b += temp;
				if(b < 0){
					b = 0;
				}
			}
			System.out.println(max);
		}
	}
}


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		double v, t, y;
		int n;

		while(sc.hasNext()){
			v = sc.nextDouble();
			t = v / 9.8;
			y = 4.9 * t * t;

			n = (int)Math.ceil((y + 5) / 5);

			System.out.println(n);
		}
	}
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Physical Experiments

Ignoring the air resistance, velocity of a freely falling object $v$ after $t$ seconds and its drop $y$ in $t$ seconds are represented by the following formulas:

$ v = 9.8 t $

$ y = 4.9 t^2 $

A person is trying to drop down a glass ball and check whether it will crack. Your task is to write a program to help this experiment.

You are given the minimum velocity to crack the ball. Your program should print the lowest possible floor of a building to crack the ball. The height of the $N$ floor of the building is defined by $5 \times N - 5$.

Input

The input consists of multiple datasets. Each dataset, a line, consists of the minimum velocity v (0 < v < 200) to crack the ball. The value is given by a decimal fraction, with at most 4 digits after the decimal point. The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the lowest possible floor where the ball cracks.

Sample Input

25.4
25.4

Output for the Sample Input

8
8


import java.util.Scanner;

public class Main {
   static Scanner sc = new Scanner(System.in);

   public static void main(String[] args) {
	   while(sc.hasNext()){
		   new Main();
	   }
   }

   public Main() {
       new aoj0195().doIt();
   }
   class aoj0195 {
	   String hitandblow(int a[], int b[]) {
		   int hit = 0;
			int hblow = 0;
			int blow = 0;
			String result = "";
			for (int i = 0; i < 4; i++) {
				if (a[i] == b[i]) {
					hit++;
				}
			}
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					if (a[i] == b[j]) {
						if(i != j){
							hblow++;
						}
					}
				}
			}
			blow = hblow ;

			result = hit + " " + hblow;

			return result;
		}

       void doIt() {
   		int A[] = new int[4];
   		int B[] = new int[4];

   		for (int i = 0; i < 4; i++) {
   			A[i] = sc.nextInt();
   		}
   		for (int i = 0; i < 4; i++) {
   			B[i] = sc.nextInt();
   		}
   		System.out.println(hitandblow(A, B));
       }
   }
}

Hit and Blow

Let's play Hit and Blow game. A imagines four numbers and B guesses the numbers. After B picks out four numbers, A answers:

The number of numbers which have the same place with numbers A imagined (Hit)

The number of numbers included (but different place) in the numbers A imagined (Blow)

For example, if A imagined numbers:

9 1 8 2

and B chose:

4 1 5 9

A should say 1 Hit and 1 Blow.

Write a program which reads four numbers A imagined and four numbers B chose and prints the number of Hit and Blow respectively. You may assume that the four numbers are all different and within from 0 to 9.

Input

The input consists of multiple datasets. Each dataset set consists of:

a1 a2 a3 a4
b1 b2 b3 b4

, where ai (0 ≤ ai ≤ 9) is i-th number A imagined and bi (0 ≤ bi ≤ 9) is i-th number B chose.

The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the number of Hit and Blow in a line. These two numbers should be separated by a space.

Sample Input

9 1 8 2
4 1 5 9
4 6 8 2
4 6 3 2

Output for the Sample Input

1 1
3 0


import java.util.Scanner;

public class Main {
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		int n = sc.nextInt();
		int num[] = new int[10];
		int a = 0;
		int b = 0;
		String str = "YES";

		for (int s = 0; s < n; s++) {
			for (int i = 0; i < 10; i++) {
				num[i] = sc.nextInt();
			}
			for (int i = 0; i < 10; i++) {
				if (a < num[i]) {
					a = num[i];
				} else if (b < num[i] && a > num[i]) {
					b = num[i];
				} else {
					str = "NO";
				}
			}
			System.out.println(str);

		}

	}

}

玉

図のように二股に分かれている容器があります。1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし、左の筒 B か右の筒 C に玉を入れます。板 D は支点 E を中心に左右に回転できるので、板 D を動かすことで筒 B と筒 C のどちらに入れるか決めることができます。

開口部 A から落とす玉の並びを与えます。それらを順番に筒 B 又は筒 Cに入れていきます。このとき、筒 B と筒 C のおのおのが両方とも番号の小さい玉の上に大きい玉を並べられる場合は YES、並べられない場合は NO と出力するプログラムを作成してください。ただし、容器の中で玉の順序を入れ替えることはできないものとします。また、続けて同じ筒に入れることができるものとし、筒 B, C ともに 10 個の玉がすべて入るだけの余裕があるものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 N が与えられます。つづいて、N 行のデータセットが与えられます。各データセットに 10 個の番号が左から順番に空白区切りで与えられます。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

2
3 1 4 2 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

Output for the Sample Input

YES
NO


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner sc = null;
		try {
			sc = new Scanner(System.in);
			String[] input = sc.nextLine().split(",");
			int largestKukanNum = input.length - 2;

			// 区間の長さの合計
			int kukanSum = 0;
			for (int i = 0; i < largestKukanNum; i++) {
				kukanSum += Integer.parseInt(input[i]);
			}

			// 区間1側の終端駅を出発した電車の速度
			int v1 = Integer.parseInt(input[input.length - 2]);
			// 反対側の終端駅を出発した電車の速度
			int v2 = Integer.parseInt(input[input.length - 1]);

			// 電車がすれ違うまでの距離を区間1から測る
			int pass = (int) Math.round(kukanSum / (v1 + v2) * v1);

			// すれ違う区間を出力する
			int passKukan = 0;
			for (int i = 0; i < largestKukanNum - 1; i++) {
				passKukan += Integer.parseInt(input[i]);
				if (passKukan > pass) {
					System.out.println(i + 1);
					break;
				}
			}

		} finally {
			sc.close();
		}
	}
}

鉄道路線

複線（上りと下りが別の線路になっていてどこででもすれ違える）の鉄道路線があります。この路線には終端駅を含めて11 の駅があり、それぞれの駅と駅の間は図で示す区間番号で呼ばれています。

この路線の両方の終端駅から列車が同時に出発して、途中で停まらずに走ります。各区間の長さと2 本の列車の速度を読み込んで、それぞれの場合について列車がすれ違う区間の番号を出力するプログラムを作成してください。ただし、ちょうど駅のところですれ違う場合は、両側の区間番号のうち小さいほうの数字を出力します。また、列車の長さ、駅の長さは無視できるものとします。

Input

複数のデータセットが与えられる。各データセットは以下のような形式で与えられる。

l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,v1,v2

li (1 ≤ li ≤ 2,000) は区間 i の長さ(km)を表す整数である。v1 は区間 1 側の終端駅を出発した列車の速度(km/h)、v2 は区間 10 側の終端駅を出発した列車の速度(km/h)を表す整数である (1 ≤ v1, v2 ≤ 2,000)。

データセットの数は 50 を超えない。

Output

データセットごとに、列車がすれちがう区間の番号を１行に出力する。

Sample Input

1,1,1,1,1,1,1,1,1,1,40,60
1,1,1,1,1,3,3,3,3,3,50,50
10,10,10,10,10,10,10,10,10,10,50,49

Output for the Sample Input

4
7
6


public class Main{
  public void run(java.io.InputStream in, java.io.PrintStream out){
    java.util.Scanner sc = new java.util.Scanner(in);
    int i, j, l, r;
    double[] a, x, y;
    String s;
    char[] ch;

    a = new double[8]; x = new double[4]; y = new double[4];
    for(;sc.hasNext();){
      s = sc.next();
      ch = new char[s.length()];
      for(i = 0;i < s.length();i++)ch[i] = s.charAt(i);
      j = 0; l = 0;r = 0;
      for(i = 0;i < 8;i++){
        for(;j < s.length() + 1;j++){
          if(j == s.length() || ch[j] == ','){
            r = j; a[i] = readdouble(ch, l, r); l = ++j; break;
          }
        }
      }

      for(i = 0;i < 8;i++){
        x[i / 2] = a[i++]; y[i / 2] = a[i];
      }
      if(isconvex(x, y, 4))out.println("YES");
      else out.println("NO");
    }

    sc.close();
  }
  public static void main(String[] args){
    (new Main()).run(System.in, System.out);
  }
  private static double readdouble(char[] ch, int l, int r){
    int i;
    double res, d;

    d = 1.0; res = 0.0;
    for(i = l;i < r;i++){
      if(ch[i] == '.')break;
      d *= 10;
    }
    d /= 10;

    for(i = l;i < r;i++){
      if(ch[i] != '.'){
        res += d * (double)(ch[i] - '0');
        d /= 10;
      }
    }
    return res;
  }
  private static boolean isconvex(double[] x, double[] y, int n){
    int i, count1, count2;
    double ax, ay, bx, by;

    count1 = 0; count2 = 0;
    for(i = 0;i < n - 1;i++){
      ax = x[(i + 1) % n] - x[i]; ay = y[(i + 1) % n] - y[i];
      bx = x[(i + 2) % n] - x[i]; by = y[(i + 2) % n] - y[i];
      if(ax * by - ay * bx < 0)count1++;
      if(ax * by - ay * bx > 0)count2++;
    }
    if(count1 == 0 || count2 == 0)return true;
    else return false;
  }
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

凸？

平面上の異なる 4 点　$A (x_a, y_a)$, $B (x_b, y_b)$, $C (x_c, y_c)$, $D(x_d, y_d)$ の座標を読み込んで、それら 4 点を頂点とした四角形 $ABCD$ に凹みがなければ YES、凹みがあれば NO と出力するプログラムを作成してください。

凹みのある四角形とは図 1 のような四角形です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

$x_a$,$y_a$,$x_b$,$y_b$,$x_c$,$y_c$,$x_d$,$y_d$

$x_a$, $y_a$, $x_b$, $y_b$, $x_c$, $y_c$, $x_d$, $y_d$ はそれぞれ -100 以上 100 以下であり、実数で与えられます。

1 直線上に 3 つ以上点が並ぶことはないものとします。また、入力順に点を結んでいけば、四角形になる順番に点の座標が入力されるものとします。（つまり、図 2 のような形になる順番で点が与えられることはありません。)

データセットの数は 100 を超えません。

Output

各データセットごとに、YES または NO を１行に出力します。

Sample Input

0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0
0.0,0.0,3.0,0.0,1.0,1.0,1.0,3.0

Output for the Sample Input

YES
NO


import java.util.*;

public class Main{

	private static final Scanner scan = new Scanner(System.in)
							.useDelimiter("[,\\s]+");

	public static void main(String[] args){

		while(scan.hasNext()){
			double[] x = new double[4];
			double[] y = new double[4];
			for(int i = 0; i < 4; i++){
				x[i] = scan.nextDouble();
				y[i] = scan.nextDouble();
			}
			boolean flag = isIntersect(x[0], y[0], x[2], y[2], x[1], y[1], x[3], y[3])
			 && isIntersect(x[1], y[1], x[3], y[3], x[0], y[0], x[2], y[2]);
			System.out.printf("%s\n", flag? "YES" : "NO");
		}
	}

	public static boolean isIntersect(double x1, double y1, double x2, double y2,
					 double x3, double y3, double x4, double y4){
		boolean result = false;
		double tb = (x1-x2)*(y3 -y1)+(y1-y2)*(x1- x3);
		double td = (x1-x2)*(y4 -y1)+(y1-y2)*(x1- x4);
		if(tb*td < 0){
			result = true;
		}
		return result;
	}
}


import java.awt.CardLayout;
import java.awt.geom.Point2D;
import java.math.BigInteger;
import java.util.*;

public class Main {
	public static void main(String[] args){
		new Main();
	}
	public Main(){
		new AOJ0038();
	}

	class AOJ0038{
		int [] cards;

		boolean four(){
			for(int i=0;i<14;i++)if(cards[i]>=4)return true;
			return false;
		}

		boolean full(){
			boolean two=false;
			boolean three=false;
			for(int s=0;s<14;s++){
				if(cards[s]==3)three=true;
				if(cards[s]==2)two=true;
			}
			return three&&two;
		}

		boolean straight(){
			if(cards[1]==1&&cards[13]==1&&cards[12]==1&&cards[11]==1&&cards[10]==1)return true;
			for(int i=5;i<14;i++){
				if(cards[i]==1&&cards[i-1]==1&&cards[i-2]==1&&cards[i-3]==1&&cards[i-4]==1)return true;
			}
			return false;
		}

		boolean three(){
			int three=0;
			for(int i=0;i<14;i++)if(cards[i]==3)three++;
			if(three==1)return true;
			return false;
		}

		boolean two(){
			int two=0;
			for(int i=0;i<14;i++)if(cards[i]==2)two++;
			if(two==2)return true;
			return false;
		}

		boolean one(){
			int two=0;
			for(int i=0;i<14;i++)if(cards[i]==2)two++;
			if(two==1)return true;
			return false;
		}

		public AOJ0038() {
			Scanner in = new Scanner(System.in);
			while (in.hasNext()) {
				String[] input = in.nextLine().split(",");
				int[] huda = new int[input.length];
				for(int i=0;i<input.length;i++)huda[i]=Integer.parseInt(input[i]);
//				String[] yaku = {"one pair","two pair","three card","straight","full house","four card"};
				//TODO 最も高い役を出力する。
				Arrays.sort(huda);//小さい順にソート
				cards = new int[14];
				for(int i=0;i<huda.length;i++)cards[huda[i]]++;
				if(four())System.out.println("four card");
				else if(full())System.out.println("full house");
				else if(straight())System.out.println("straight");
				else if(three())System.out.println("three card");
				else if(two())System.out.println("two pair");
				else if(one())System.out.println("one pair");
				else System.out.println("null");
			}

		}

	}

	class AOJ2503{
		int MAX = 0;
		public AOJ2503() {
			Scanner in = new Scanner(System.in);
			int n = in.nextInt();
			int m = in.nextInt();

			int[][] cost = new int[n][n];

			int[] dp = new int[n];
			for(int i=0;i<n*n;i++){
				cost[i/n][i%n]=MAX;
			}
			for(int i=0;i<m;i++){
				int a = in.nextInt();
				int b = in.nextInt();
				cost[a][b]=in.nextInt();
			}
			//			TODO 一番大きいパスを0のポイントからn-1のポイントまでの

			for(int s=1;s<n;s++){
				for(int i=0;i<=s;i++){
					if(cost[i][s]==MAX)continue;
					dp[s]=Math.max(dp[s],dp[i]+cost[i][s]);
				}
			}
			for(int s=0;s<n;s++)for(int i=0;i<n;i++){
				if(cost[s][i]==MAX)continue;
				dp[i]=Math.max(dp[s]+cost[s][i],dp[i]);
			}
			for(int i=0;i<n;i++)System.out.print(dp[i]+" ");
			System.out.println();
			System.out.println(dp[n-1]);
		}
	}

	class  AOJ0155{
		int d[];
		int n;
		int x[];
		int y[];
		int ban[];
		boolean sw;
		ArrayList<Integer> result;
		int back[];
		int[][] cost;
		void dijkstra(int s,int g){
			d = new int[n+1];d[s]=0;
			Arrays.fill(d,0);
			boolean used[] = new boolean[n+1];
			int sumn[] = new int[n+1];
			int v=s;
			int save = -1;
			back = new int[n+1];
			while(true){
				save = v;
				v=-1;
				for(int u=1;u<n+1;u++)if(!used[u]&&(v==-1||d[u]<d[v])){
					v=u;
				}
				System.out.println(v);
				if(v==-1)break;
				else back[v]=save;
				used[v]=true;
				for(int u=1;u<n+1;u++)if(cost[v][u]!=100000)d[u]=Math.min(1+d[v],d[u]);
			}
			for(int i=1;i<d.length;i++){
				System.out.println(i+" "+d[i]);
			}
			int now=g;
			result = new ArrayList<Integer>();
			int a=0;
			//			for(int i=0;i<back.length;i++){
			//				System.out.println(i+" "+back[i]);
			//			}
			while(true){
				if(cost[a][now]==1000000)sw = true;
				result.add(now);
				if(now==s)break;
				a = now;
				now=back[now];
			}
			return;
		}
		public AOJ0155(){
			Scanner in = new Scanner(System.in);
			while(true){
				n = in.nextInt();
				if(n==0)break;
				cost = new int[n+1][n+1];
				ban = new int[n+1];
				x = new int[n+1];
				y = new int[n+1];
				for(int i=1;i<n+1;i++){
					ban[i] = in.nextInt();
					x[ban[i]] = in.nextInt();
					y[ban[i]] = in.nextInt();
				}
				for(int i=1;i<n+1;i++){
					for(int s=i+1;s<n+1;s++){
						int x1 = x[i],y1= y[i],x2=x[s],y2=y[s];
						int costs = (int)Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
						cost[i][s] = costs > 50 ? 1000000:costs;
						cost[s][i] = cost[i][s];
					}
				}
				int kai = in.nextInt();
				for(int i=0;i<kai;i++){
					int s = in.nextInt();
					int g = in.nextInt();
					dijkstra(s, g);
//					if(sw){
//						System.out.println("NA");
//						break;
//					}
					for(int a=result.size()-1;a>=0;a--){
						System.out.print(result.get(a)+" ");
					}
					System.out.println();
				}
			}
		}
	}
}

ポーカー

ポーカーの手札データを読み込んで、それぞれについてその役を出力するプログラムを作成してください。ただし、この問題では、以下のルールに従います。

ポーカーはトランプ 5 枚で行う競技です。

同じ数字のカードは 5 枚以上ありません。

ジョーカーは無いものとします。

以下のポーカーの役だけを考えるものとします。(番号が大きいほど役が高くなります。)

役なし(以下に挙げるどれにも当てはまらない)

ワンペア（2 枚の同じ数字のカードが1 組ある）

ツーペア（2 枚の同じ数字のカードが2 組ある）

スリーカード（3 枚の同じ数字のカードが1 組ある）

ストレート（5 枚のカードの数字が連続している）

ただし、A を含むストレートの場合、A で終わる並びもストレートとします。つまり、A を含むストレート
は、A 2 3 4 5 　と　10 J Q K A 　の２種類です。J Q K A 2 などのように、A をまたぐ並び
はストレートではありません。（この場合、「役なし」になります）。

フルハウス（3 枚の同じ数字のカードが1 組と、残りの2 枚が同じ数字のカード）

フォーカード（4 枚の同じ数字のカードが1 組ある）

Input

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

手札1,手札2,手札3,手札4,手札5

手札は、トランプのJ(ジャック) を11、Q(クイーン) を12、K(キング) を13、A（エース）を 1、その他はそれぞれの数字で表すこととします。

データセットの数は 50 を超えません。

Output

データセットごとに、手札によってできる最も高い役をひとつ出力してください。役の表記については出力例に従ってください。

Sample Input

1,2,3,4,1
2,3,2,3,12
12,13,11,12,12
7,6,7,6,7
3,3,2,3,3
6,7,8,9,10
11,12,10,1,13
11,12,13,1,2

Output for the Sample Input

one pair
two pair
three card
full house
four card
straight
straight
null

3 3 2 3 3 という手札であったときは、two pair ではなく four card です。


import java.util.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main {

	int INF = 1 << 28;

	void run() {
		Scanner sc = new Scanner(System.in);
		HashMap<Character, Integer> map = new HashMap<Character, Integer>();
		map.put('I', 1); map.put('V', 5); map.put('X', 10);
		map.put('L', 50); map.put('C', 100); map.put('D', 500); map.put('M', 1000);
		while(sc.hasNext()) {
			String str = sc.next();
			int ans = 0, c = 1, buf = 0;
			for(int i=str.length()-1;i>=0;i--) {
				int val = map.get(str.charAt(i));
				if( buf > val ) c = -1;
				if( buf < val ) c = 1;
				ans += c*val;
				buf = val;
			}
			System.out.println(ans);
		}
	}

	public static void main(String[] args) {
		new Main().run();
	}

	void debug(Object... os) {
		System.err.println(Arrays.deepToString(os));
	}
}

ローマ数字

古代ローマでは数を数えることは難しい仕事でした。アラビア数字の 0,1,2,3,…, 9 はまだ流布していませんでした。その代わり次のような記号が使われていました。

アラビア数字

ローマ数字

アラビア数字

ローマ数字

アラビア数字

ローマ数字

1

I

11
XI

30

XXX

2

II

12
XII

40

XL

3

III

13
XIII

50

L

4

IV

14
XIV

60

LX

5

V

15
XV

70

LXX

6

VI

16
XVI

80

LXXX

7

VII

17
XVII

90

XC

8

VIII

18
XVIII

100

C

9

IX

19
XIX

500

D

10

X

20
XX

1000

M

I は 1、 V は 5、 X は 10、 L は 50、 C は 100、 D は 500、 M は 1000、 他の例は上の表を見てください。小さい数が大きい数に続いている、つまり右側にあるときは足し算をします。小さい数が大きい数の前に、つまり左にあるときは、大きい数から小さい数を引きます。大きい数字の前にあって引き算を表す小さな数字は一回の引き算あたりひとつしかありません。

ローマ数字をアラビア数字（通常の数字）の表記（10 進表示）に変換して出力するプログラムを作成してください。ただし、与えられるローマ数字は上記のルールにのみ従っています(実際のローマ数字の表記にはもっと細かいルールがありますが、ここでは考慮する必要はありません。たとえば、実際のローマ数字ではI はV かX から、X はL かC から、C はD かM からしか引き算しませんし、同じローマ数字は４つ以上（または５つ以上）足し並べることはありません。)

Input

複数のデータセットが与えられます。それぞれのデータセットにローマ数字（半角大文字のI, V, X, L, C, D ,M で表される連続した文字列）が１行に与えられます。与えられるローマ数字の文字列の長さはおのおの 100 以下です。

データセットの数は 50 を超えません。

Output

各データセットに対し、アラビア数字（整数）を１行に出力して下さい。

Sample Input

IV
CCCCLXXXXVIIII
CDXCIX

Output for the Sample Input

4
499
499


import java.util.Scanner;
public class Main {
    public static void main (String[] args) {
	Scanner scan = new Scanner(System.in);
	int n = Integer.parseInt(scan.nextLine());
	String cipherText;
	for (int i = 0; i < n; i++) {
	    cipherText = scan.nextLine();
	    solve(cipherText);
	}
    }
    static void solve (String cipherText) {
	int[] alpa = {1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25};
	for (int i = 0; i < alpa.length; i++) {
	    int a = alpa[i];
	    for (int b = 0; b < 26; b++) {
		if (cipherText.contains(encode("this", a, b)) || cipherText.contains(encode("that", a, b))) {
		    System.out.println(decode(cipherText, a, b));
		    return;
		}
	    }
	}
    }

    static String encode (String plainText, int a, int b) {
	StringBuilder sb = new StringBuilder();
	for (int i = 0; i < plainText.length(); i++) {
	    char c = plainText.charAt(i);
	    sb.append((char)((a * (c - 'a') + b) % 26 + 'a'));
	}
	return sb.toString();
    }

    static String decode (String cipherText, int a, int b) {
	StringBuilder sb = new StringBuilder();
	int[] table = new int[26];
	for (int i = 0; i < 26; i++) {
	    int n = (a * i + b) % 26;
	    table[n] = i;
	}
	for (int i = 0; i < cipherText.length(); i++) {
	    char c = cipherText.charAt(i);
	    if (c == ' ') {
		sb.append(c);
	    } else {
		sb.append((char)(table[c - 'a'] + 'a'));
	    }
	}
	return sb.toString();
    }
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

アフィン暗号

簡単な暗号法の一つに、アフィン暗号というものがあります。まず、アルファベット a〜z を a = 0, b = 1, c = 2,..., x = 23, y = 24, z = 25 と 0〜25 の数字に置き換えます。そして、以下の式で、原文のアルファベットを置換します。

$F(\gamma) = (\alpha \cdot \gamma + \beta)$ mod $26$

ただし、mod 26 は 26 で割った余りを表します。例えば、$\alpha = 3, \beta = 2$ のとき、アルファベットの 'a' (=0) は、$F(0) = (3 \cdot 0 + 2)$ mod $26 = 2$ で 'c' に、アルファベットの 'n' (=13) は $F(13) = (3 \cdot 13 + 2)$ mod $26 = 15$ で 'p' に置換されます。
このとき、$\gamma$ に対する $F(\gamma)$ が必ず 1 対 1 で対応付けられるように、$\alpha$ と $\beta$ は慎重に選ばれているものとします（$\alpha$ と 26 が互いに素であることが条件）。$\alpha = 4, \beta = 7$ のときのように、$F('a') = 7, F('n') = 7$ と、'a' も 'n' も同じ 'h' に置換されるようなことはありません。また、アルファベット以外の文字は置換されません。

暗号化された文字列を元の文章に復号したものを出力するプログラムを作成してください。元の文章には、キーワードとして

that
this

のいずれかが必ず含まれているものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 $n$ ($n \leq 30$) が与えられます。続いて $n$ 行のデータが与えられます。各データセットに英小文字と空白からなる 256 文字以内の暗号化された文章が１行に与えられます。

Output

各データセットに対して、復号した元の文章を１行に出力して下さい。

Sample Input

1
y eazqyp pnop pngtg ye obmpngt xmybp mr lygw

Output for the Sample Input

i submit that there is another point of view


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static char[] array = new char[13];

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;

		try {
			while ((line = br.readLine()) != null) {
				line = line.trim();
				array = line.toCharArray();
				int[] numCount = new int[10];
				for (int i = 0; i < array.length; i++) {
					numCount[array[i] - '0']++;
				}
				String ans = "0";
				for (int i = 1; i <= 9; i++) {
					if (numCount[i] == 4)
						continue;
					searchHead: for (int j = 1; j <= 9; j++) {
						int[] num = numCount.clone();
						num[i]++;
						if (num[j] - 2 < 0)
							continue;
						num[j] -= 2;
						// 順子チェック
						for (int k = 1; k <= 7; k++) {
							if (num[k] < 0)
								continue searchHead;
							int surplus = num[k] % 3;
							if (surplus != 0) {
								num[k] -= surplus;
								num[k + 1] -= surplus;
								num[k + 2] -= surplus;
							}
						}
						// 8と9は0か3
						if (((num[8] % 3) + (num[9] % 3)) == 0 && num[8] >= 0 && num[9] >= 0) {
							if (ans.equals("0")) {
								ans = Integer.toString(i);
							} else {
								ans += " " + Integer.toString(i);
							}
							break searchHead;
						}
					}
				}
				System.out.println(ans);
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

パズル

1 〜 9 の数字を 14 個組み合わせて完成させるパズルがあります。与えられた 13 個の数字にもうひとつ数字を付け加えて完成させます。

パズルの完成条件は

同じ数字を２つ組み合わせたものが必ずひとつ必要です。

残りの12 個の数字は、３個の数字の組み合わせ４つです。

３個の数字の組み合わせ方は、同じ数字を３つ組み合わせたものか、または３つの連続する数字を組み合わせたものです。ただし、9 1 2 のような並びは連続する数字とは認められません。

同じ数字は4 回まで使えます。

13 個の数字からなる文字列を読み込んで、パズルを完成することができる数字を昇順に全て出力するプログラムを作成してください。なお、1〜9 のどの数字を付け加えてもパズルを完成させることができないときは 0 を出力してください。

例えば与えられた文字列が 3456666777999 の場合

「2」があれば、　234 567 666 77 999

「3」があれば、　33 456 666 777 999

「5」があれば、　345 567 666 77 999

「8」があれば、　345 666 678 77 999

というふうに、2 3 5 8 のいずれかの数字が付け加えられるとパズルは完成します。「6」でも整いますが、5 回目の使用になるので、この例では使えないことに注意してください。

Input

入力は複数のデータセットからなります。各データセットとして、13 個の数字が１行に与えられます。データセットの数は 50 を超えません。

Output

データセットごとに、パズルを完成させることができる数字を昇順に空白区切りで１行に出力します。

Sample Input

3649596966777
6358665788577
9118992346175
9643871425498
7755542764533
1133557799246

Output for the Sample Input

2 3 5 8
3 4
1 2 3 4 5 6 7 8 9
7 8 9
1 2 3 4 6 7 8
0


import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			for(int i=n-1;i>=0;i--){
				boolean flag=true;
				for(int j=2;j<Math.sqrt(i);j++){
					if(i%j==0){
						flag=false;
						break;
					}
				}
				if(flag){
					System.out.print(i+" ");
					break;
				}
			}
			for(int i=n+1;;i++){
				boolean flag=true;
				for(int j=2;j<Math.sqrt(i);j++){
					if(i%j==0){
						flag=false;
						break;
					}
				}
				if(flag){
					System.out.print(i);
					break;
				}
			}
		}
	}
}

素数 II

素数というのは、1 よりも大きくそれ自身か 1 でしか割りきれない整数をいいます。例えば、2 は、2 と 1 でしか割り切れないので素数ですが、12 は、12 と 1 のほかに、2, 3, 4, 6 で割りきれる数なので素数ではありません。

整数 n を入力したとき、n より小さい素数のうち最も大きいものと、n より大きい素数のうち最も小さいものを出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットに n (3 ≤ n ≤ 50,000) が１行に与えられます。

データセットの数は 50 を超えません。

Output

各データセットに対して、n より小さい素数のうち最大のものと、n より大きい素数のうち最小のものを１つのスペースで区切って１行に出力して下さい。

Sample Input

19
3517

Output for the Sample Input

17 23
3511 3527


import java.util.Scanner;

class Main
{
	public static void main(String args[])
	{
		Scanner sc = new Scanner(System.in);
		System.out.println(sc.nextLine().replaceAll("peach", "apple"));
	}
}

りんごと桃

福島県は果物の産地としても有名で、その中でも特に桃とりんごは全国でも指折りの生産量を誇っています。ところで、ある販売用の英文パンフレットの印刷原稿を作ったところ、手違いでりんごに関する記述と桃に関する記述を逆に書いてしまいました。

あなたは、apple と peach を修正する仕事を任されましたが、なにぶん面倒です。１行の英文を入力して、そのなかの apple という文字列を全て peach に、peach という文字列を全てapple に交換した英文を出力するプログラムを作成してください。

Input

英文（半角英数字、空白、記号を含む）が１行に与えられます。入力される文字列の長さは 1000 以下です。

Output

apple とpeach という文字列を交換した英文を１行に出力します。

Sample Input

the cost of one peach is higher than that of one apple.

Output for the Sample Input

the cost of one apple is higher than that of one peach.


import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main{

	private static int a, b, n;
	private static char[] f;

	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		while((line=br.readLine()) != null){
			String[] arrays = line.split(" ");
			a = Integer.parseInt(arrays[0]);
			b = Integer.parseInt(arrays[1]);
			n = Integer.parseInt(arrays[2]);
			f = (String.valueOf((double)a/b).split("\\."))[1].toCharArray();

			int sum = 0;
			for(int i=0;i<n && i<f.length;i++){
				sum = sum + (int)(f[i]-'0');
			}
			System.out.println(sum);
		}

	}
}

小数位の和

a, b, n は、いずれも正の整数であるとします。分数 a / b の小数第 i 位の数を f(i) とします (0 ≤ f(i) ≤ 9)。このとき、i = 1 から n までの f(i) の和を s とします。

s = f(1) + f(2) + ... + f(n)

a, b, n を読み込んで、 s を出力して終了するプログラムを作成してください。

Input

入力は複数のデータセットからなります。各データセットとして、3 つの整数 a (1 ≤ a ≤ 1000), b (1 ≤ b ≤ 10000), n (1 ≤ n ≤ 100) が空白区切りで１行に与えられます。

データセットの数は 100 を超えません。

Output

データセットごとに、s を１行に出力します。

Sample Input

1 2 3
2 3 4
5 4 3
4 3 2

Output for the Sample Input

5
24
7
6


import java.util.ArrayList;
import java.util.Scanner;

class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> list = new ArrayList<Integer>();

		int n,count;
		boolean is;

		while(true){

			n = sc.nextInt();
			if(n == 0)break;
			count = 0;

			for(int i = 2; i < n; i++){
				is = true;
				for(int j = 2; j <= Math.sqrt(i); j++)
					if(i % j == 0){
						is = false;
						break;
					}

				if(is)list.add(i);
			}
			for(int i = 0; i < list.size(); i++)
				for(int j = i; j < list.size(); j++)
					if(list.get(i) + list.get(j) == n)count++;

			System.out.println(count);
			list.clear();
		}
		sc.close();
		}
}

ゴールドバッハの予想

4 以上の偶数は 2 つの素数の和で表すことができるということが知られています。これはゴールドバッハ予想といい、コンピュータの計算によりかなり大きな数まで正しいことが確かめられています。例えば、10 は、7 + 3、5 + 5 の 2 通りの素数の和で表すことができます。

整数 n を入力し、n を 2 つの素数の和で表す組み合わせ数が何通りあるかを出力するプログラムを作成してください。ただし、n は 4 以上、50,000 以下とします。また、入力される n は偶数であるとはかぎりません。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。n が 0 のとき入力の最後とします。データセットの数は 10,000 を超えません。

Output

各データセットに対して、n を 2 つの素数の和で表す組み合わせ数を１行に出力して下さい。

Sample Input

10
11
0

Output for the Sample Input

2
0


import java.util.*;
import java.lang.*;

class Main {
    public static void main(String[] args) {
	Scanner s = new Scanner(System.in);
	double ep = 0.000001;
	while(s.hasNext()) {
	    double[] d = new double[8];
	    Double ab,cd;
	    for(int i=0 ; i<8 ; i++)
		d[i] = s.nextDouble();
	    if((d[2]-d[0]) != 0)
		ab = (d[3]-d[1])/(d[2]-d[0]);
	    else
		ab = Double.NaN;

	    if((d[6]-d[4]) != 0)
	       cd = (d[7]-d[5])/(d[6]-d[4]);
	    else
		cd = Double.NaN;
	    String ans;
	    if ((ab == 0 && cd.isNaN()) || (ab.isNaN() && cd == 0)) {
		ans = "YES";
	    } else {
		if ((ab*cd + 1.0) < ep)
		    ans = "YES";
		else
		    ans = "NO";
	    }
	    System.out.println(ans);
	    System.out.println(ab + " " + cd);
	}
    }
}

MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

直交判定

平面上の異なる 4 点、$A (x_A, y_A)$, $B (x_B, y_B)$, $C (x_C, y_C)$, $D (x_D, y_D)$ の座標を読み込んで、直線 $AB$ と $CD$ が直交する場合には YES、直交しない場合には NO と出力するプログラムを作成してください。ここで、「直線」とは線分のことではありません。以下の図を参考にして下さい。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

$x_A$ $y_A$ $x_B$ $y_B$ $x_C$ $y_C$ $x_D$ $y_D$

$x_A$, $y_A$, $x_B$, $y_B$, $x_C$, $y_C$, $x_D$, $y_D$ はそれぞれ -100 以上 100 以下であり、各値は小数点以下最大 5 桁までの数字を含む実数で与えられます。

データセットの数は 100 を超えません。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

1.0 1.0 2.0 2.0 0.0 0.0 1.0 -1.0
0.0 0.0 2.0 0.0 -1.0 2.0 2.0 2.0
10.0 6.0 3.4 5.2 6.8 9.5 4.3 2.1
2.5 3.5 2.5 4.5 -3.3 -2.3 6.8 -2.3

Output for the Sample Input

YES
NO
NO
YES


import java.awt.geom.Point2D;
import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		Point2D.Double p[];
		String str[];

		p = new Point2D.Double[4];
		while (sc.hasNext()) {
			str = sc.nextLine().split(" ");
			for (int i = 0; i < 4; i++) {
				p[i] = new Point2D.Double(Double.valueOf(str[2 * i]), Double.valueOf(str[2 * i + 1]));
			}
			double dx1, dx2, dy1, dy2;
			dx1 = p[1].x - p[0].x;
			dy1 = p[1].y - p[0].y;
			dx2 = p[2].x - p[3].x;
			dy2 = p[2].y - p[3].y;
			if (dx1 * dx2 + dy1 * dy2 == 0) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		}
	}
}


import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] p = new int[101];
		int[] s = new int[31];
		while(sc.hasNext()) {
			String[] t = sc.next().split(",");
			if(t[0].equals("0")) break;
			p[Integer.parseInt(t[0])] = Integer.parseInt(t[1]);
			s[Integer.parseInt(t[1])]++;
		}
		int[] r = new int[31];
		int k = 1;
		for(int i = 30; i >= 0; i--) {
			r[i] = k;
			if(s[i] != 0) {
				k++;
			}
		}
//		for(int i = 30; i >= 0; i--) {
//			System.out.printf("%d %d\n", i, r[i]);
//		}
//		for(int i = 1; i <= 5; i++) {
//			System.out.println(r[p[i]]);
//		}
		while(sc.hasNext()) {
			int q = sc.nextInt();
			System.out.println(r[p[q]]);
		}
		sc.close();
	}
}

Rank Checker

時は2020 年。パソコン甲子園 2020 の予選結果を保存したデータがあります。このデータには、各チームに振られる整理番号と正解数が保存されています。ここでは、正解数で順位を決定するものとし、正解数の多いほうから順に 1 位、2 位 ... と順位をつけていくこととします。

予選結果のデータと整理番号をキーボードから入力して、その番号のチームの順位を出力するプログラムを作成してください。

Input

入力データは２つの部分からなります。前半の部分は、予選結果のデータ、後半の部分は順位を知りたいチーム番号の問い合わせです。予選結果のデータの形式は以下の通りです。

p1,s1
p2,s2
...
...
0,0

pi (1 ≤ pi ≤ 100 )、 si (0 ≤ si ≤ 30) はそれぞれ i チーム目の整理番号と正解数を表す整数です。整理番号と正解数がともに 0 のときこのデータの入力が終わるものとします。

続いて後半の問い合わせが複数与えられます。問い合わせの形式は以下の通りです。

q1
q2
:

各問い合わせは１行に整理番号 qi (1 ≤ qi ≤ 30) が与えられます。これを入力の最後まで処理して下さい。問い合わせの数は 100 を超えません。

Output

各問い合わせについて、チームの順位を１行に出力して下さい。

Sample Input

1,20
2,20
3,30
4,10
5,10
6,20
0,0
1
2
4
5

Output for the Sample Input

2
2
3
3

Note

入力例のデータにおいて、チームを正解数順に整列すると：

3,30
1,20
2,20
6,20
4,10
5,10

となります。ここでは、正解数を基に順位を決定するため、30問正解チームを1位、20問正解チームを2位、10問正解チームを3位とします（上位のチーム数を考慮し、10問正解チームを5位とする通常の順位付けとは異なることに注意して下さい）。


import java.util.Scanner;

class Main{

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String str="";
		String[] dset;
		double[] moji=new double[6];
		double[] kotae=new double[2];

		while(sc.hasNext()) {
			str=sc.next();
			dset=str.split(",");
			for(int i=0; i<6; i++) {
				moji[i]=Double.parseDouble(dset[i]);
			}
			kotae=kotae(moji);
			System.out.println(kotae[0]+" "+kotae[1]);
			moji=new double[6];
			kotae=new double[2];
		}
	}

	public static double[] kotae(double[] a) {
		double[] ansary=new double[2];
		ansary[0]=0;
		ansary[1]=0;
		double difx=0;
		double dify=0;
		double ktm1=0;

		double[] cyokusen = new double[3];		// katamuki suihei_ka_suicyoku_ka  y_spn
												//y jiku ni heikou -1  x jikuni heikou 1
		double[] suisen=new double[3];		//	suise wo hiku

		difx=a[2]-a[0];
		dify=a[3]-a[1];

		if(Math.abs(dify)==0) {
			cyokusen[0]=0;
			cyokusen[1]=4;
			cyokusen[2]=a[3];		// y seppen

			suisen[0]=0;
			suisen[1]=-4;
			suisen[2]=a[4];		// y jiku heikou nara   x seppen

			ansary[0]=a[4];
			ansary[1]=cyokusen[2]*2-a[5];

			return ansary;

		}
		else if(Math.abs(difx)==0) {
			cyokusen[0]=0;
			cyokusen[1]=-4;
			cyokusen[2]=a[2];		// x seppen

			suisen[0]=0;
			suisen[1]=4;
			suisen[2]=a[5];				//垂線のあたりが微妙

			ansary[0]=cyokusen[2]*2-a[4];
			ansary[1]=suisen[2];

			return ansary;
		}
		else {
			cyokusen[0]=dify/difx;
			cyokusen[1]=0;
			cyokusen[2]=a[3]-cyokusen[0]*a[2];

			ktm1=-1/cyokusen[0];

			suisen[0]=ktm1;
			suisen[2]=a[5]-suisen[0]*a[4];

			ansary[0]=-1*(cyokusen[2]-suisen[2])/(cyokusen[0]-suisen[0]);
			ansary[1]=ansary[0]*cyokusen[0]+cyokusen[2];		//交点

			//System.out.println(ansary[0]+","+ansary[1]);
			ansary[1]=ansary[1]*2-a[5];
			ansary[0]=ansary[0]*2-a[4];

		}
		return ansary;
	}
}

線対称

平面上の異なる 3 点 P1(x1,y1), P2(x2,y2), Q(xq,yq) の座標の組を読み込んで、点 P1 点P2 を通る直線を対称軸として点 Q と線対称の位置にある点 R(x,y) を出力するプログラムを作成してください。なお、点 Q は、その対称軸上にないものとします。

入力

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

x1,y1,x2,y2,xq,yq

x1, y1, x2, y2, xq, yq (-100 以上 100 以下の実数) がカンマ区切りで１行に与えられます。

データセットの数は 50 を超えない。

出力

データセットごとに、x, y を空白区切りで 1 行に出力する。出力は実数で 0.0001 以下の誤差を含んでもよい。

Sample Input

1.0,0.0,-1.0,0.0,1.0,1.0
1.0,0.0,0.0,-1.0,3.0,0.0
0.0,1.0,0.0,-1.0,1.0,1.0

Output for the Sample Input

1.000000 -1.000000
1.000000 2.000000
-1.000000 1.000000


import java.util.Scanner;

public class Main {

	void run() {
		Scanner sc = new Scanner(System.in);
		while (true) {
			// input
			int n = sc.nextInt();
			if (n == 0) {
				return;
			}
			float[] x = new float[n];
			float[] y = new float[n];
			for (int i = 0; i < n; i++) {
				String str = sc.next();
				String[] s = new String[2];
				s = str.split(",");
				x[i] = Float.parseFloat(s[0]);
				y[i] = Float.parseFloat(s[1]);
			}

			int max = 0;
			for (int i = 0; i < n; i++) {
				int count = 0;
				for (int j = i + 1; j < n; j++) {
					float d = distance(x[i], y[i], x[j], y[j]);
					if (0 <= d && d <= 4) {
						count++;
						// System.out.println("i:" + i + ", j:" + j + ", d:" +
						// d);
					}
				}
				max = Math.max(max, count);
			}
			System.out.println(max + 1);
		}
	}

	public float distance(float x0, float y0, float x1, float y1) {
		return ((x0 - x1) * (x0 - x1) + (y0 - y1) * (y0 - y1));
	}

	public static void main(String[] args) {
		new Main().run();
	}

}

シールの重なり

1 辺の長さが 10 の正方形の折り紙に半径 1 の円形のシールを n 枚貼ります。シールは重ねて貼ることができます。シールを貼る位置の座標を読み込んで、折り紙上でもっとも多くシールが重なっている場所(シールが１枚だけでも"重なっている"とする)でのシールの枚数を出力するプログラムを作成してください。

折り紙の左下を原点とした x, y 座標を与えます。この x, y を円の中心としてシールを貼ることとします。円の中心が折り紙の外に出ることはありません。また、同一座標に複数のシールが貼られることはありません。

Input

複数のデータセットが与えられます。各データセットは以下のような形式で与えられます。

n
x1,y1
x2,y2
:
xn,yn

１行目にシールの枚数 n (0 ≤ 100) が与えられます。続く n 行に、各シールの中心座標が与えられます。
xi, yi は i 枚目のシールの中心の x 座標と y 座標を表します。各値は小数点以下最大 6 桁までの数字を含む実数で与えられます。

n が 0 のとき、入力の最後とします。データセットの数は 50 を超えません。

Output

各データセットに対し、折り紙上で最も多くシールが重なっている場所でのシールの枚数（整数）を出力して下さい。

Sample Input

15
3.14979,8.51743
2.39506,3.84915
2.68432,5.39095
5.61904,9.16332
7.85653,4.75593
2.84021,5.41511
1.79500,8.59211
7.55389,8.17604
4.70665,4.66125
1.63470,4.42538
7.34959,4.61981
5.09003,8.11122
5.24373,1.30066
0.13517,1.83659
7.57313,1.58150
0

Output for the Sample Input

4

Hint

入力例のようにシールを貼った図です。円はシール、数字は入力例の行数を表しています。
点(2.3,4.6)では、入力例の 2 行目、3 行目、6 行目、10 行目の 4 枚のシールが重なっています。

6 と 9 のおのおのの中心の距離は 2.01293 なので、シールは重なっていません。1 と 12 のおのおのの中心の距離は 1.98231 なので、シールは重なっています。

２つの円が接しているとき（おのおのの中心の距離が 2 のとき）は、重なっているものとします。


import java.awt.geom.Point2D;
import java.util.*;

public class Main {
	Scanner in = new Scanner(System.in);
	public static void main(String[] args) {
		new Main();
	}

	public Main() {
		new AOJ0090().doIt();
	}

	class AOJ0090{
		void doIt(){
			while(true){
				int n = in.nextInt();
				if(n==0)break;
				ArrayList<Point2D> p = new ArrayList<Point2D>();
				ArrayList<Point2D> list = new ArrayList<Point2D>();
				for(int i=0;i<n;i++){
					String res[] = in.next().split(",");
					p.add(new Point2D.Double(Double.parseDouble(res[0]),Double.parseDouble(res[1])));
				}
				for(int i=0;i<n;i++)for(int s=i+1;s<n;s++){
					Point2D[] a = intersectPtCC(new Circle(p.get(i),1),new Circle(p.get(s),1));
					if(a==null)continue;
					list.add(a[0]);list.add(a[1]);
				}
				int result = 1;
				for(int i=0;i<list.size();i++){
					int cnt = 0;
					for(int s=0;s<n;s++)if(list.get(i).distance(p.get(s))<=1){
						cnt++;
					}
					result = Math.max(result, cnt);
//					if(cnt>=5)System.out.println(list.get(i));
				}
				System.out.println(result);
			}
		}

		class Circle{
			Point2D p;
			double r;
			Circle(Point2D p,double r){
				this.p=p;
				this.r=r;
			}
			Circle(double x,double y,double r){
				this.p=new Point2D.Double(x,y);
				this.r=r;
			}
		}
		 //円と円の交点
		Point2D [] intersectPtCC(Circle a,Circle b){
		double dis = a.p.distance(b.p);
		if(dis > a.r + b.r)return null;
		Point2D v = sub(b.p, a.p);
		double rc=(dis*dis+a.r*a.r- b.r*b.r)/(2*dis);
		double rate = rc / dis;
		v = mul(rate, v);
		Point2D c = add(v, a.p);
		double disC2c = c.distance(b.p);
		double disqc = Math.sqrt(b.r * b.r - disC2c * disC2c);
		Point2D v2 = sub(b.p, c);
		v2 = mul(disqc / disC2c, v2);
		Point2D [] res = new Point2D[2];
		res[0] = add(normalVector1(v2), c);
		res[1] = add(normalVector2(v2), c);
		return res;
		}

		Point2D normalVector1(Point2D p){
			return new Point2D.Double(-p.getY(), p.getX());
		}
		Point2D normalVector2(Point2D p){
			return new Point2D.Double(p.getY(), -p.getX());
		}
		Point2D mul(double n,Point2D p1){
			return new Point2D.Double(p1.getX()*n,p1.getY()*n);
		}
		Point2D sub(Point2D p1,Point2D p2){
			return new Point2D.Double(p1.getX()-p2.getX(),p1.getY()-p2.getY());
		}
		Point2D add(Point2D p1,Point2D p2){
			return new Point2D.Double(p1.getX()+p2.getX(), p1.getY()+p2.getY());
		}
	}
}


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main{

	static Main byakko = new Main();
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args){

		int n;
		boolean is;

		while(true){
			n = sc.nextInt();
			if(n == 0)break;
			HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
			ArrayList<Integer> list = new ArrayList<Integer>();
			is = true;

			for(int i = 0; i < n; i++){
				int x = sc.nextInt();
				if(map.containsKey(x)){
					map.put(x, map.get(x) + sc.nextInt() * sc.nextInt());
				}else{
					map.put(x, sc.nextInt() * sc.nextInt());
					list.add(x);
				}
			}
			for(int i = 0; i < list.size(); i++){
				if(map.get(list.get(i)) >= 1000000){
					System.out.println(list.get(i));
					is = false;
				}
			}
			if(is)
				System.out.println("NA");
		}
		sc.close();
	}
}

Sale Result

There is data on sales of your company. Your task is to write a program which identifies good workers.

The program should read a list of data where each item includes the employee ID i, the amount of sales q and the corresponding unit price p. Then, the program should print IDs of employees whose total sales proceeds (i.e. sum of p × q) is greater than or equal to 1,000,000 in the order of inputting. If there is no such employees, the program should print "NA". You can suppose that n < 4000, and each employee has an unique ID. The unit price p is less than or equal to 1,000,000 and the amount of sales q is less than or equal to 100,000.

Input

The input consists of several datasets. The input ends with a line including a single 0. Each dataset consists of:

n (the number of data in the list)
i p q
i p q
:
:
i p q

Output

For each dataset, print a list of employee IDs or a text "NA"

Sample Input

4
1001 2000 520
1002 1800 450
1003 1600 625
1001 200 1220
2
1001 100 3
1005 1000 100
2
2013 5000 100
2013 5000 100
0

Output for the Sample Input

1001
1003
NA
2013


import java.util.Scanner;

public class Main {
	static class Worker {
		int number;
		long result;

		Worker (int number, long result) {
			this.number = number;
			this.result = result;
		}

		public void add(long result) {
			this.result += result;
		}
	}

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n;
		boolean flag;
		Worker worker[];
		int index;

		n = sc.nextInt();
		while (n != 0) {
			worker = new Worker[n];
			index = 0;
			flag = true;
			for (int i = 0; i < n; i++) {
				int number = sc.nextInt();
				int cost   = sc.nextInt();
				int lots   = sc.nextInt();
				boolean flag2 = true;
				for (int j = 0; j < index; j++) {
					if (worker[j].number == number) {
						worker[j].add((long)(cost * lots));
						flag2 = false;
					}
				}
				if (flag2) {
					worker[index] = new Worker(number, (long)(cost * lots));
					index++;
				}
			}

			for (int i = 0; i < index; i++) {
				if (1000000 <= worker[i].result) {
					System.out.println(worker[i].number);
					flag = false;
				}
			}
			if (flag) {
				System.out.println("NA");
			}

			n = sc.nextInt();
		}
	}
}


import java.io.*;

public class Main {
	public static void main(String[] args) {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			int n;
			while (0 != (n = Integer.parseInt(in.readLine()))) {
				int[][] a = new int[n + 1][n + 1];
				for (int i = 0; i < n; i++) {
					String[] s = in.readLine().split(" ");
					int sum = 0;
					for (int j = 0; j < n; j++) {
						a[i][j] = Integer.parseInt(s[j]);
						sum += a[i][j];
					}
					a[i][n] = sum;
				}
				for (int i = 0; i <= n; i++) {
					int sum = 0;
					for (int j = 0; j <= n; j++) {
						sum += a[j][i];
					}
					a[n][i] = sum;
				}
				for (int i = 0; i <= n; i++) {
					for (int j = 0; j <= n; j++) {
						System.out.printf("%5d", a[i][j]);
					}
					System.out.println();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Matrix-like Computation

Your task is to develop a tiny little part of spreadsheet software.

Write a program which adds up columns and rows of given table as shown in the following figure:

Input

The input consists of several datasets. Each dataset consists of:

n (the size of row and column of the given table)
1st row of the table
2nd row of the table
:
:
nth row of the table

The input ends with a line consisting of a single 0.

Output

For each dataset, print the table with sums of rows and columns. Each item of the table should be aligned to the right with a margin for five digits. Please see the sample output for details.

Sample Input

4
52 96 15 20
86 22 35 45
45 78 54 36
16 86 74 55
4
52 96 15 20
86 22 35 45
45 78 54 36
16 86 74 55
0

Output for the Sample Input

52 96 15 20 183
86 22 35 45 188
45 78 54 36 213
16 86 74 55 231
199 282 178 156 815
52 96 15 20 183
86 22 35 45 188
45 78 54 36 213
16 86 74 55 231
199 282 178 156 815


import java.util.*;

public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		while(n-- > 0){
			p = sc.next().toCharArray();
			Parsed ans = expr(0);
			System.out.println(ans.val);
		}
	}

	static char[] p;

	static Parsed expr(int idx){
		Parsed r = term(idx);
		while(p[r.idx] == '+' || p[r.idx] == '-'){
			char op = p[r.idx];
			int tmp = r.val;
			r = term(r.idx + 1);
			if(op == '+') r.val = tmp + r.val;
			else r.val = tmp - r.val;
		}
		return r;
	}

	static Parsed term(int idx){
		Parsed r = fact(idx);
		while(p[r.idx] == '*' || p[r.idx] == '/'){
			char op = p[r.idx];
			int tmp = r.val;
			r = fact(r.idx + 1);
			if(op == '*') r.val = tmp * r.val;
			else r.val = tmp / r.val;
		}
		return r;
	}

	static Parsed fact(int idx){
		if(Character.isDigit(p[idx])){
			int t = p[idx++] - '0';
			while(Character.isDigit(p[idx]))t = t*10 + p[idx++] - '0';
			return new Parsed(t,idx);
		}
		else if(p[idx] == '('){
			Parsed r = expr(idx + 1);
			if(p[r.idx] != ')') return null;
			return new Parsed(r.val, r.idx + 1);
		}
		else return null;
	}
}

class Parsed{
	int val;
	int idx;
	Parsed(int val,int idx){
		this.val = val;
		this.idx = idx;
	}
}

Smart Calculator

Your task is to write a program which reads an expression and evaluates it.

The expression consists of numerical values, operators and parentheses, and the ends with '='.

The operators includes +, - , *, / where respectively represents, addition, subtraction, multiplication and division.

Precedence of the operators is based on usual laws. That is one should perform all multiplication and division first, then addition and subtraction. When two operators have the same precedence, they are applied from left to right.

You may assume that there is no division by zero.

All calculation is performed as integers, and after the decimal point should be truncated

Length of the expression will not exceed 100.

-1 × 109 ≤ intermediate results of computation ≤ 109

Input

The input is a sequence of datasets. The first line contains an integer n which represents the number of datasets. There will be n lines where each line contains an expression.

Output

For each datasets, prints the result of calculation.

Sample Input

2
4-2*3=
4*(8+4+3)=

Output for the Sample Input

-2
60


import java.math.*;
import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    while (sc.hasNext()) {
      String line = sc.next();
      boolean flag = false;
      for (char c = '0'; c <= '9'; ++c) {
        String temp = line;
        temp = temp.replace('X', c);
        String[] elem = temp.split("[^0-9]");

        boolean ok = true;
        for (int i = 0; i < 3; ++i) {
          if (elem[i].length() > 1 && elem[i].charAt(0) == '0') {
            ok = false;
          }
        }
        if (!ok) continue;

        BigInteger l1 = new BigInteger(elem[0]);
        BigInteger l2 = new BigInteger(elem[1]);
        BigInteger r = new BigInteger(elem[2]);

        l1 = l1.add(l2);
        if (l1.equals(r)) {
          System.out.println(c); flag = true; break;
        }
      }
      if (!flag) {
        System.out.println("NA");
      }
    }

  }
}

覆面算

数式の一部を隠してしまって、隠した数字を探す問題を覆面算といいます。今回は、数式の中のある数字のいくつかを X で隠してしまった式を扱います。以下の数式を入力して、結果を出力するプログラムを作成してください。

数式

「数字列 + 数字列 = 数字列」の形で、1 行の単純な足し算式です。

「数字列」は、数字 0 から 9 と文字 X の並びです。

2 桁以上の「数字列」の左端の数字は 0 ではないものとします。

X は、数式全体の中で必ず 1 つ以上含まれます。

結果

覆面算の答えです。数式が成り立つ様な X の値で 0 ~ 9 のどれか 1 つです。2 つ以上の答えはないものとします。

答えがない場合、結果は“NA”としてください。

Input

複数のデータセットが与えられます。各データセットとして、X を 1 つ以上含む足し算式(空白を含まない 126 文字以内の文字列) が１行に与えられます。データセットの数は 150 を超えません。

Output

各データセットについて、覆面算の結果を１行に出力してください。数字 0 ~ 9 または NA を出力してください。

Sample Input

123+4X6=X79
12X+4X6=X79
XX22+89=X2XX

Output for the Sample Input

5
NA
1


import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main {

	int INF = 1 << 28;

	void run() {
		Scanner sc = new Scanner(System.in);
		for(;sc.hasNext();) {
			String formula = sc.next();
			String[] str = formula.split("[ + = ]");
			boolean f = true;
			for(String s: str) f = !(s.length() != 1 && s.charAt(0) == '0');
			int i=0;
			for(i=f? 0: 1;i<10;i++) {
				if(isequal(formula, i)) break;
			}
			System.out.println((i==10? "NA": i));
		}
	}

	boolean isequal(String formula, int i) {
		String[] s = formula.replace('X', (char) (i+'0')).split("[ + = ]");
		BigInteger v1 = new BigInteger(s[0]);
		BigInteger v2 = new BigInteger(s[1]);
		BigInteger v3 = new BigInteger(s[2]);

		return v1.add(v2).compareTo(v3) == 0;
	}

	public static void main(String[] args) {
		new Main().run();
	}

	void debug(Object... os) {
		System.err.println(Arrays.deepToString(os));
	}
}


7 パズル

7 パズルは 8 つの正方形のカードとこれらのカードがぴたりと収まる枠で構成されています。それぞれのカードには、互いに区別できるように 0, 1, 2, ..., 7 と番号がつけられています。枠には、縦に 2 個、横に 4 個のカードを並べることができます。

7 パズルを始めるときには、まず枠にすべてのカードを入れます。枠のなかで 0 のカードだけは、上下左右に隣接するカードと位置を交換することができます。たとえば、枠の状態が図(a) のときに、0 のカードの右に隣接した、7 のカードと位置を交換すれば、図(b) の状態になります。あるいは、図(a) の状態から 0 のカードの下に隣接した 2 のカードと位置を交換すれば図(c) の状態になります。図(a) の状態で 0 のカードと上下左右に隣接するカードは 7 と 2 のカードだけなので、これ以外の位置の入れ替えは許されません。

ゲームの目的は、カードをきれいに整列して図(d) の状態にすることです。最初の状態を入力とし、カードをきれいに整列するまでに、必要な最小手数を出力するプログラムを作成してください。ただし、入力されたカードの状態からは図(d) の状態に移ることは可能であるとします。

入力データは、1 行に 8 つの数字が空白区切りで与えられます。これらは、最初の状態のカードの並びを表します。例えば、図(a) の数字表現は0 7 3 4 2 5 1 6 に、図(c) は 2 7 3 4 0 5 1 6 となります。

図(a) 0 7 3 4 2 5 1 6 の場合

図(b) 7 0 3 4 2 5 1 6 の場合

図(c) 2 7 3 4 0 5 1 6 の場合

図(d) 0 1 2 3 4 5 6 7 (最終状態)

Input

上記形式で複数のパズルが与えられます。入力の最後まで処理してください。
与えられるパズルの数は 1,000 以下です。

Output

各パズルについて、最終状態へ移行する最小手数を１行に出力してください。

Sample Input

0 1 2 3 4 5 6 7
1 0 2 3 4 5 6 7
7 6 5 4 3 2 1 0

Output for the Sample Input

0
1
28


import java.util.*;

public class Main{

    int[] v;
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};

    void solve(){
        Scanner sc = new Scanner(System.in);

        calc();

        while(sc.hasNext()){
            String pzl = "";
            for(int i=0; i<2; i++)
                for(int j=0; j<4; j++) pzl += sc.next();

            System.out.println(v[Integer.parseInt(pzl)/10]);
        }
    }

    void calc(){
        Queue<int[]> q = new LinkedList<int[]>();
        q.add(new int[]{1234567,0,0,0});

        v = new int[7654322];
        Arrays.fill(v,-1);
        v[123456] = 0;

        while(q.size()>0){
            int[] pp = q.poll();
            int x = pp[1], y = pp[2], cnt = pp[3];

            String pzzs = String.valueOf(pp[0]);
            if(pzzs.length()==7) pzzs = "0" + pzzs;
            char[] c = pzzs.toCharArray();

            for(int i=0; i<4; i++){
                int nx = x+dx[i], ny = y+dy[i];
                if(nx<0 || nx>=4 || ny<0 || ny>=2) continue;
                c[y*4+x] = c[ny*4+nx];
                c[ny*4+nx] = '0';
                int ns = Integer.parseInt(String.valueOf(c));
                if(v[ns/10]==-1){
                    v[ns/10] = cnt+1;
                    q.add(new int[]{ns,nx,ny,cnt+1});
                }
                c[ny*4+nx] = c[y*4+x];
                c[y*4+x] ='0';
            }
        }
    }

    public static void main(String[] args){
        new Main().solve();
    }
}


スピードスケートバッジテスト

スピードスケートバッジテストでは、2 種類の距離で規定されたタイムを上回った場合に級が認定されます。例えば A 級になるには 500 M で 40.0 秒未満、かつ 1000 M で 1 分 23 秒未満であることが求められます。

スピードスケート大会 (500 M と 1000 M) で記録したタイムを入力とし、スピードスケートバッジテストで何級に相当するかを出力するプログラムを作成して下さい。500 M と1000 M のバッジテスト規定タイムは下表のとおりです。 E 級に満たなかった場合には、NA と出力してください。

500 M

1000 M

AAA 級

35 秒 50

1 分 11 秒 00

AA 級

37 秒 50

1 分 17 秒 00

A 級

40 秒 00

1 分 23 秒 00

B 級

43 秒 00

1 分 29 秒 00

C 級

50 秒 00

1 分 45 秒 00

D 級

55 秒 00

1 分 56 秒 00

E 級

1分10 秒 00

2 分 28 秒 00

Input

複数のデータセットが与えられます。各データセットとして、500 M タイムと 1000 M タイムをそれぞれ表す実数 t1, t2 (8.0 ≤ t1, t2 ≤ 360.0) が空白区切りで与えられます。t1, t2 は秒単位で小数点以下最大 2 桁までの数字を含む実数で与えられます。

データセットの数は 100 を超えません。

Output

各データセットごとに、判定結果 AAA ~ E または NA を１行に出力してください。

Sample Input

40.0 70.0
72.5 140.51

Output for the Sample Input

B
NA


import static java.util.Arrays.deepToString;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.concurrent.PriorityBlockingQueue;

public class Main {
	public static void main(String[] args) {
		new Main().run();
	}
	void tr(Object... os) {
		System.err.println(deepToString(os));
	}

	Scanner sc = new Scanner(System.in);

	int[] ans;
	public void run() {
		ans = new int[100];

		PriorityQueue<Event> pq = new PriorityQueue<Event>();
		int[] table = new int[17];
		Arrays.fill(table, -1);
		int nextGroup = 0;
		for (int i = 0; i < 100; i++) {
			Event e = new Event();
			e.id = i;
			e.move = Event.ARRIVE;
			e.time = i * 5;
			e.num = i % 5 == 1 ? 5 : 2;
			e.duration = 17*(i%2) + 3*(i%3)+19;
			pq.add(e);
		}
		while (!pq.isEmpty()) {
			Event e = pq.poll();
//			tr(e.time, e.id, e.move, table);
			if (e.move == Event.LEAVE) {
				for (int i = 0; i < table.length; i++) {
					if (table[i] == e.id) table[i] = -1;
				}
			} else if (e.move == Event.ARRIVE) {
				int pos = -1;
				if (nextGroup == e.id) {
					for (int i = 0; i + e.num < table.length; i++) {
						boolean ok = true;
						for (int j = 0; j < e.num; j++) {
							if (table[i+j] != -1) {
								ok = false;
								break;
							}
						}
						if (ok) {
							pos = i;
							break;
						}
					}
				}
				if (pos >= 0) {
					// 座る
					ans[e.id] = e.time - e.id * 5;
					for (int j = 0; j < e.num; j++) {
						table[pos + j] = e.id;
					}
					e.time += e.duration;
					e.move = Event.LEAVE;
					pq.add(e);
					nextGroup++;
				} else {
					// 空いてなければ待つ。時刻+1して席が空くのを待つ手抜き実装
					e.time++;
					pq.add(e);
				}
			}
		}
		for (;sc.hasNext();) {
			int n = sc.nextInt();
			System.out.println(ans[n]);
		}
	}

	class Event implements Comparable<Event> {
		static final int LEAVE = 0;
		static final int ARRIVE = 1;
		int id;
		int move;
		int time;
		int num;
		int duration;
		@Override
		public int compareTo(Event o) {
			int c = time - o.time;
			if (c == 0) c = move - o.move;
			if (c == 0) c = id - o.id;
			return c;
		}
	}
}

福縞軒

「福縞軒」は行列のできる人気のラーメン屋です。でも最近、お客さんの間から「待ち時間が長いのに、店に入ったら空席があるのは許せない」という声が聞こえるようになってきました。どうしてそんな不満が出るのか調べたいのですが、お店が開いているあいだは忙しくて、実際の行列の様子を調べることができません。しかし、長年の経験からお客さんが来る間隔や人数は分かっているので、それをもとに待ち時間の分析をすることにしました。

店内にはカウンターに向かって 17 の席があります。開店時間は正午で、お客さんは次のようにやってきます。

0 番から 99 番までの 100 組のグループが来ます。

i 番目のグループは正午から 5i 分後にお店に到着します。

i 番目のグループの人数は i % 5 が 1 のとき 5 人、それ以外のときは 2 人です。

(x % yは x を y で割ったときの余りを表わします。)

i 番目のグループは、席に着くと 17(i % 2) + 3(i % 3) + 19 分間で食事を済ませます。

最初の 10 グループの到着時刻、人数、食事時間は次のようになります。

グループ番号

0

1

2

3

4

5

6

7

8

9

到着時刻(分後)

0

5

10

15

20

25

30

35

40

45

人数(人)

2

5

2

2

2

2

5

2

2

2

食事時間(分)

19

39

25

36

22

42

19

39

25

36

また、お客さんを席に案内するときには、次のようにしています。

席には 0 から 16 までの番号が付いています。

x 人のグループは連続して x 個あいている席があった時だけ着席できます。

また、座れる場所が複数あった場合は、席の番号が最も小さくなるところに座ります。例えば、0、1、2、4、5番の席だけが空いていた場合、5 人のグループは着席できません。2 人のグループであれば 0、1 番に着席します。

一度着席したら、席を移動してもらうことはしません。

お客さんは 1 分単位で出入りします。各時刻には次の順序でお客さんを案内します。

前のグループの離席と同時に次のグループの着席が可能となります。

お客さんを着席させる際には、行列の先頭にいるグループから順に、できる限り多くのグループを同じ時刻に着席させます。行列の順序を追い越すことはしません。つまり、先頭のグループが着席できなければ、行列内の他のグループが着席できたとしても、着席させません。

その時刻に到着したグループは、行列が残っている場合は行列の最後尾に並びます。行列が無く、着席できる場合は着席し、できない場合は並んで待ちます。例として最初の 10 グループが到着するまでの様子を示すと以下のようになります。各行の3つの欄は、左から時刻、座席の様子、行列の様子を示しています。座席は「_」が空席で、番号はその席にその番号のグループが座っていることを示しています。

時刻: 座席 行列
0: 00_______________:
5: 0011111__________:
10: 001111122________:
15: 00111112233______:
18: 00111112233______:
19: __111112233______:
20: 44111112233______:
25: 4411111223355____:
30: 4411111223355____: 66666 グループ6が到着
34: 4411111223355____: 66666
35: 4411111__3355____: 6666677 グループ7が到着
40: 4411111__3355____: 666667788 グループ8が到着
41: 4411111__3355____: 666667788
42: __11111__3355____: 666667788
43: __11111__3355____: 666667788
44: 6666677883355____: グループ6、7、8が着席
45: 666667788335599__: グループ9が到着、着席

例えば、時刻 40 では 8 番目のグループが到着しますが、着席できないので行列に加わります。4 番目のグループは時刻 41 まで食事をします。時刻 42 では、4 番目のグループの席が空きますが、連続した席数が足りないので 6 番目のグループはまだ着席できません。1 番目のグループは時刻 43 まで食事をします。時刻 44 で 1 番目のグループの席が空くので、6 番目のグループが着席し、同時に 7 番目、8 番目のグループも着席します。9 番目のグループは時刻 45 で到着し、席が空いているのでそのまま着席します。

これらの情報を基にして、0 以上 99 以下の整数 n を入力として、n 番目グループのお客さんが待つ時間(分単位)を出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットは１つの整数 n からなります。

データセットの数は 20 を超えません。

Output

各データセットについて、n 番目のお客の分単位の待ち時間(0 以上の整数)を１行に出力してください。

Sample Input

5
6
7
8

Output for the Sample Input

0
14
9
4


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Main {
    // 店のカウンター
    static int[] serviceCounters;
    // 次に到着するグループ番号
    static int nextArrivalGroupNumber;
    // 待ち行列作成(到着したグループを格納)
    static LinkedList<Integer> waitGroupNumberList;
    // 正午から現在までの経過時間（分）
    static int currentTime;

    // 各グループの情報を登録（添え字はグループ番号を表す）
    // グループの人数
    static List<Integer> groupNumberOfPeopleList;
    // 店に到着する時間（分）
    static List<Integer> arrivalTimeList;
    // 食事時間（分）
    static List<Integer> eatTimeList;
    // 席に着いた時間（分）
    static List<Integer> sitTimeList;
    // 待ち時間（分）
    static List<Integer> waitTimeList;

    // 初期化
    public static void init() {
        serviceCounters = new int[17];
        // 空席を"-1"とするため、"-1"で初期化
        Arrays.fill(serviceCounters, -1);
        nextArrivalGroupNumber = 0;
        waitGroupNumberList = new LinkedList<Integer>();
        currentTime = 0;
        groupNumberOfPeopleList = new ArrayList<Integer>();
        arrivalTimeList = new ArrayList<Integer>();
        eatTimeList = new ArrayList<Integer>();
        sitTimeList = new ArrayList<Integer>();
        waitTimeList = new ArrayList<Integer>();
    }

    public static void main(String[] args) {

        // 入力値を一行分取得する。
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Integer inputNumber = null;
        while (true) {
            String inputStr = null;
            try {
                inputStr = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (inputStr == null) {
                break;
            }
            inputNumber = Integer.valueOf(inputStr);
            // 変数の初期化
            init();
            // 各グループの情報を登録する。（入力されたグループ番号まで）
            for (int i = 0; i <= inputNumber; i++) {
                arrivalTimeList.add(calArrivalTime(i));
                groupNumberOfPeopleList.add(calgroupNumberOfPeople(i));
                eatTimeList.add(calEatTime(i));
            }

            // メイン処理開始
            while (true) {
                // 次に到着するグループがいるか調べ、いれば待ち行列の最後尾にセットする
                if (inputNumber >= nextArrivalGroupNumber) {
                    if (currentTime == arrivalTimeList.get(nextArrivalGroupNumber)) {
                        waitGroupNumberList.offer(nextArrivalGroupNumber);
                        nextArrivalGroupNumber++;
                    }
                }

                // 食べ終わったグループに退店される
                exitGroup();

                // 待っているグループがいれば着席させる
                sitGroup();

                currentTime++;

                // 終了条件
                // 入力されたグループ番号まで客を入店させ、最後のグループが着席（待ち行列が空）すれば終了。
                if ((inputNumber + 1) == nextArrivalGroupNumber && waitGroupNumberList.isEmpty()) {
                    break;
                }
            }
            System.out.println(waitTimeList.get(inputNumber));
        }
    }

    /**
     *
     *
 [機能] 食べ終わったグループがいればに退店させる。

     *
 [説明] グループが着席してからの経過時間を調べ、食事時間と一致すれば退店させる。

     */
    private static void exitGroup() {
        for (int i = 0; i < serviceCounters.length; i++) {
            if (serviceCounters[i] != -1) {
                // 食事が終了したか判定
                if (eatTimeList.get(serviceCounters[i]) == (currentTime - sitTimeList.get(serviceCounters[i]))) {
                    int emptyCounter = serviceCounters[i];
                    // グループの人数分空席にする
                    for (int j = 0; j < groupNumberOfPeopleList.get(emptyCounter); j++) {
                        serviceCounters[i + j] = -1;
                    }
                }
            }
        }
    }

    /**
     *
     *
 [機能] 空席があれば待っているグループに座らせる。

     *
 [説明] 待ち行列の先頭のグループと店の空席を確認し、座らせる。

     *
 [備考] 着席時間と待ち時間を設定する。

     */
    private static void sitGroup() {
        while (!(waitGroupNumberList.isEmpty())) {
            int firstWaitGroupNumber = waitGroupNumberList.poll();
            int firstCountNumber = getSeriesChairs(firstWaitGroupNumber);
            // 座れる席がない場合
            if (firstCountNumber == -1) {
                // 待ち行列にグループを戻す
                waitGroupNumberList.addFirst(firstWaitGroupNumber);
                break;
            }
            for (int i = 0; i < groupNumberOfPeopleList.get(firstWaitGroupNumber); i++) {
                serviceCounters[firstCountNumber + i] = firstWaitGroupNumber;
            }
            // 着席時間を設定
            sitTimeList.add(currentTime);
            // 待ち時間を設定
            waitTimeList.add(currentTime - arrivalTimeList.get(firstWaitGroupNumber));

        }
    }

    /**
     *
     *
 [機能] カウンターの先頭から空席を調べ、

     *                    連続した空席が入力値以上になれば連続した空席の最も小さい席番号を返す。

     *                    それ以外は-1を返す。

     *@param firstWaitGroupNumber グループ番号
     * @return  連続空席の最も小さい席番号
     */
    private static int getSeriesChairs(int firstWaitGroupNumber) {
        for (int startPoint = 0; startPoint < serviceCounters.length; startPoint++) {
            if (serviceCounters[startPoint] == -1) {
                int emptyCount = 1;
                for (int endpoint = startPoint + 1; endpoint < serviceCounters.length; endpoint++) {
                    // 空席ならカウント
                    if (serviceCounters[endpoint] == -1) {
                        emptyCount++;
                        // 連続空席がグループの人数以上か判定
                        if (emptyCount >= groupNumberOfPeopleList.get(firstWaitGroupNumber)) {
                            return startPoint;
                        }
                    } else {
                        startPoint = endpoint + 1;
                        break;
                    }

                }
            }
        }
        // 座れる席がない場合は-1を返す
        return -1;
    }

    /**
     *
 [機能] グループの人数を計算する。

     */
    public static int calgroupNumberOfPeople(int GroupNumber) {
        if (GroupNumber % 5 == 1) {
            return 5;
        }
        return 2;
    }

    /**
     *
 [機能] 食事時間を計算する。

     */
    public static int calEatTime(int GroupNumber) {
        return 17 * (GroupNumber % 2) + 3 * (GroupNumber % 3) + 19;
    }

    /**
     *
 [機能] 店への到着時間の計算する。

     */
    public static int calArrivalTime(int GroupNumber) {
        return GroupNumber * 5;
    }

    /**
     *
 [機能] 到着したグループ番号に1を加算する。

     * @param arrivaledGroupNumber 到着したグループ番号
     */
    public static void addNextArrivaledGroupNumber(Integer arrivaledGroupNumber) {
        nextArrivalGroupNumber++;
    }

}


import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		loop: while (true) {
			Point2D.Double[] points = new Point2D.Double[4];
			int maxx = Integer.MIN_VALUE;
			int maxy = Integer.MIN_VALUE;
			int minx = Integer.MAX_VALUE;
			int miny = Integer.MAX_VALUE;
			for (int i = 0; i < 4; i++) {
				int x = scanner.nextInt();
				int y = scanner.nextInt();
				if (i == 0 && x == 0 && y == 0) {
					break loop;
				}
				points[i] = new Point2D.Double(x, y);
				if (i != 3) {
					maxx = Math.max(maxx, x);
					maxy = Math.max(maxy, y);
					minx = Math.min(minx, x);
					miny = Math.min(miny, y);
				}
			}
			double r = scanner.nextDouble();
			Line2D.Double a = new Line2D.Double(points[1], points[2]);
			Line2D.Double b = new Line2D.Double(points[2], points[0]);
			Line2D.Double c = new Line2D.Double(points[0], points[1]);
			double d0 = points[3].distance(points[0]);
			double d1 = points[3].distance(points[1]);
			double d2 = points[3].distance(points[2]);
			double ap = a.ptSegDist(points[3]);
			double bp = b.ptSegDist(points[3]);
			double cp = c.ptSegDist(points[3]);
			Path2D.Double path = new Path2D.Double();
			path.moveTo(points[0].x, points[0].y);
			path.lineTo(points[1].x, points[1].y);
			path.lineTo(points[2].x, points[2].y);

			if (d0 <= r && d1 <= r && d2 <= r) {
				System.out.println("b");
			} else if (path.contains(points[3])) {
				if (ap > r && bp > r && cp > r) {
					System.out.println("a");
				} else {
					System.out.println("c");
				}
			} else {
				if (d0 > r && d1 > r && d2 > r) {
					System.out.println("d");
				} else {
					System.out.println("c");
				}
			}

		}
	}
}

三角形と円

平面上にある三角形と円の位置関係を判定するプログラムを作成してください。対象となる図形はいずれも境界を含むものとします。
三角形は 3 頂点の位置が与えられ、円は中心の位置と半径が与えられます。位置は直交座標系による２つの整数の組によって与えられます。半径も整数で与えられます。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

x1 y1
x2 y2
x3 y3
xc yc
r

１行目から３行目に、三角形の第 i の頂点座標 xi, yi が与えられます。４行目に円の中心の座標 xc, yc、５行目に円の半径 r が与えられます。与えられる入力はすべて、1 以上 10,000 以下の整数とします。

データセットの数は 100 を超えません。

Output

入力データセットごとに以下の形式で判定結果を１行に出力します。

円が三角形に含まれる場合 a

三角形が円に含まれる場合 b

それ以外の場合で、共通部分がある場合には c

共通部分がない場合には d

Sample Input

1 1
3 1
3 3
3 2
3
3 12
9 3
11 12
8 7
5
15 3
17 7
22 5
7 6
4
6 11
8 2
16 9
10 8
2
0 0

Output for the Sample Input

b
c
d
a


import java.awt.geom.Point2D;
import java.io.*;
import java.math.BigInteger;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Stack;
import java.util.TreeMap;

public class Main {

	static PrintWriter out = new PrintWriter(System.out);
	static FastScanner sc = new FastScanner();
	static Scanner stdIn = new Scanner(System.in);
	static int INF = 2 << 26;
	static char[][] map;
	static ArrayList<Data> list = new ArrayList<Data>();
	public static void main(String[] args) {
		while(true) {
			list.clear();
			int n = sc.nextInt();
			if(n == 0) break;
			for(int i = 0; i < n; i++) {
				list.add(new Data(sc.nextInt(), sc.nextInt()));
			}
			int m = sc.nextInt();
			for(int i = 0; i < m; i++) {
				list.add(new Data(sc.nextInt(), sc.nextInt()));
			}

			Collections.sort(list,new Comp());

			int[] dp = new int[n + m];
			dp[0] = 1;

			for(int i = 1; i < n + m; i++) {
				if(list.get(i).h > list.get(i-1).h && list.get(i).r > list.get(i-1).r) {
					dp[i] = Math.max(dp[i], dp[i-1] + 1);
				}
				if(i > 1 && list.get(i).h > list.get(i-2).h && list.get(i).r > list.get(i-2).r && list.get(i-1).r == list.get(i-2).r) {
					dp[i] = Math.max(dp[i], dp[i-2]+1);
				}

			}
			Arrays.sort(dp);
			out.println(dp[n + m-1]);

		}
		out.flush();
	}

	static class Comp implements Comparator<Data>{

		@Override
		public int compare(Data o1, Data o2) {
			return o1.r - o2.r;
		}

	}

	static class Data{
		int h;
		int r;
		Data(int a, int b) {
			h = a;
			r = b;
		}
	}

}

//------------------------------//
//-----------//
class FastScanner {
    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;
    private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        }else{
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    }
    private int readByte() { if (hasNextByte()) return buffer[ptr++]; else return -1;}
    private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126;}
    private void skipUnprintable() { while(hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;}
    public boolean hasNext() { skipUnprintable(); return hasNextByte();}
    public String next() {
        if (!hasNext()) throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while(isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }
    public long nextLong() {
        if (!hasNext()) throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while(true){
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            }else if(b == -1 || !isPrintableChar(b)){
                return minus ? -n : n;
            }else{
                throw new NumberFormatException();
            }
            b = readByte();
        }
    }

    public int nextInt() {
    	 if (!hasNext()) throw new NoSuchElementException();
         int n = 0;
         boolean minus = false;
         int b = readByte();
         if (b == '-') {
             minus = true;
             b = readByte();
         }
         if (b < '0' || '9' < b) {
             throw new NumberFormatException();
         }
         while(true){
             if ('0' <= b && b <= '9') {
                 n *= 10;
                 n += b - '0';
             }else if(b == -1 || !isPrintableChar(b)){
                 return minus ? -n : n;
             }else{
                 throw new NumberFormatException();
             }
             b = readByte();
         }
    }

    public double nextDouble() {
    	return Double.parseDouble(next());
    }

}

マトリョーシカ

マトリョーシカとは女性像をかたどった木製の人形で、ロシアの代表的な民芸品です。マトリョーシカは、大きな人形の中にそれより小さな人形が入っている入れ子構造になっており、大きさの異なる複数の人形で構成されています。このような入れ子構造にするため、各人形の胴体は上下で分割できる筒状の構造になっています。マトリョーシカは職人の手で手作りされるため、一つ一つの人形は世界に一つしかない非常に貴重なものになります。

兄弟である一郎君と次郎君は、マトリョーシカで遊ぶのが大好きで、各自がそれぞれ1組のマトリョーシカを持っていました。一郎君のマトリョーシカは n 個の人形から構成されており、次郎君のマトリョーシカは m 個の人形から構成されています。

ある日、好奇心が旺盛な一郎君は、これら2組のマトリョーシカに含まれる人形たちを組み合わせて、より多くの人形を含む新たなマトリョーシカを作れないかと考えました。つまり、n + m 個の人形を使い、k 個の人形からなる１組のマトリョーシカを作ることを試みたのです。n と m の大きい方よりも k を大きくすることができれば、一郎君の目的は達成されます。

兄弟は2人仲良く、どのように人形を組み合わせれば k の値を最大にできるかを考えました。しかし、幼い2人にとってこの問題はあまりにも難しいので、年上のあなたはプログラムを作成して弟たちを助けることにしました。

一郎君と次郎君のマトリョーシカの人形の情報を入力とし、新たなマトリョーシカが含む人形の数 k を出力するプログラムを作成して下さい。入力される人形に大きさが同じものは存在しません。また、人形を高さ h 半径 r の円柱とみなした場合、高さh、半径 r の人形が含むことのできる人形は x < h かつ y < r を満たす高さ x 半径 y の人形です。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下の形式で与えられます。

n
h1 r1
h2 r2
:
hn rn
m
h1 r1
h2 r2
:
hm rm

１行目に一郎君のマトリョーシカの人形の数 n (n ≤ 100)、続く n 行に一郎君の第 i の人形の高さ hi と半径 ri (hi, ri < 1000) が与えられます。

続く行に二郎君のマトリョーシカの人形の数 m (m ≤ 100)、続く m 行に二郎君の第 i の人形の高さ hi と半径 ri (hi, ri < 1000) が与えられます。

データセットの数は 20 を越えない。

Output

入力データセットごとに新たなマトリョーシカが含む人形の数 k を出力します。

Sample Input

6
1 1
4 3
6 5
8 6
10 10
14 14
5
2 2
5 4
6 6
9 8
15 10
4
1 1
4 3
6 5
8 6
3
2 2
5 4
6 6
4
1 1
4 3
6 5
8 6
4
10 10
12 11
18 15
24 20
0

Output for the Sample Input

9
6
8


import java.util.*;
import java.io.*;
import java.math.BigDecimal;
import java.awt.geom.*;
import static java.util.Arrays.*;

class Main{
	public static void main(String[] args){
		Scanner stdIn = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		while(true){
			int m = Integer.parseInt(stdIn.next());
			if(m==0){
				break;
			}
			int[] vm = new int[m];
			for(int i=0;i<m-1;i++){
				vm[i] = Integer.parseInt(stdIn.next());
			}
			int n = Integer.parseInt(stdIn.next());
			int[] vn = new int[n];
			for(int i=0;i<n-1;i++){
				vn[i] = Integer.parseInt(stdIn.next());
			}

			double marea = 0;
			double narea = 0;
			for(int i=0;i<m-1;i++){
				marea += Math.sin(Math.toRadians(vm[i]));
			}
			for(int i=0;i<n-1;i++){
				narea += Math.sin(Math.toRadians(vn[i]));
			}

			if(Math.abs(marea-narea)<Math.pow(10,-5)){
				out.println(0);
			}
			else if(marea<narea){
				out.println(2);
			}
			else{
				out.println(1);
			}
			out.flush();
		}
	}
}

多角形の面積

１つの円に内接する２つの多角形の頂点情報を入力とし、それらの面積の大小関係を出力するプログラムを作成してください。

X 角形の各頂点には反時計回りに 1 から X まで番号が振ってあるものとします（図は、X = 4 の場合の例を示しています）。ただし、与えられる多角形は円の中心を内部に含むものとし、頂点 i の位置に関するデータは、頂点 i から頂点 i+1 まで反時計回りに計った中心角の角度 v (1 ≤ v < 180 の整数) で与えられます。また、出力する大小関係については、第１の多角形の面積が大きい場合は 1 (半角数字)、第２の多角形の面積が大きい場合は 2 (半角数字)、それぞれの面積が等しい場合は 0 (半角数字) と出力してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

m
v1
v2
:
vm −1
n
v1
v2
:
vn − 1

１行目に第１の多角形の頂点の数 m (3 ≤ m ≤ 50)、続く m − 1 行に第１の多角形の頂点 i の情報 vi (1 ≤ vi < 180) が与えられます。

続く行に第２の多角形の頂点の数 n (3 ≤ n ≤ 50)、続く n − 1 行に第２の多角形の頂点 i の情報 vi (1 ≤ vi < 180) が与えられます。

データセットの数は 200 を超えません。

Output

データセットごとに大小関係（半角数字）を１行に出力します。

Sample Input

4
30
125
75
4
30
125
75
5
30
125
75
65
4
30
125
75
4
30
125
75
6
30
50
50
25
75
0

Output for the Sample Input

0
1
2


import java.util.*;

public class Main {
	Scanner sc = new Scanner(System.in);
	void doIt() {
		while(true){
			String str[]=sc.nextLine().split(" ");
			if(Integer.valueOf(str[0]).intValue() == 0)break;
			int cnt = 0;
			int ans = 0;
			for(int i = 0;i < str.length;i++){
				int num = Integer.valueOf(str[i]).intValue();
				if(num == 1){
					cnt++;ans++;
				}else{
					if(num > 10){
						ans = ans + 10;
					}else{
						ans = ans + num;
					}
				}
			}
			for(int i = 0;i < cnt;i++){
				if(ans + 10 > 21)break;
				else{
					ans = ans + 10;
				}
			}
			if(ans > 21){
				System.out.println(0);
			}else{
				System.out.println(ans);
			}
		}
     }
    public static void main(String[] args) {
    	// TODO Auto-generated method stub
    	new Main().doIt();
    }
}

ブラックジャック

ブラックジャックはカジノで行われるカードゲームの一種で、1 〜 13 までの数が書かれたカードを使ってゲームが行われます。各カードの点数は次のように決まっています。

1 は 1 点あるいは 11 点

2 から 9 までは、書かれている数の通りの点数

10 から 13 までは、10 点

このゲームには親を含めた何人かの参加者がおり、それぞれが何枚かのカードの組を持っています。このカードの組のことを手と呼びます。手の点数はカードの点数の合計です。その計算は次のように行うものとします。

カードの点数の合計が 21 より大きくなるときは、手の点数を 0 点とする

カードの点数として、1 は 1 点と計算しても 11 点と計算してもよいが、手の点数が最大となる方を選ぶこととする

配られたカードの情報を入力とし、手の点数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

c1 c2 ... cn

１行に i 番目のカードに書かれている整数 ci (1 ≤ ci ≤ 13) が空白区切りで１行に与えられます。カードの数 n は 100 を超えません。

データセットの数は 200 を超えません。

Output

データセットごとに手の点数を１行に出力します。

Sample Input

1
7 7 7
7 7 8
12 1
10 1 1
0

Output for the Sample Input

11
21
0
21
12


import java.io.*;
import java.util.*;
import java.math.*;
class Main{
    static int[] prime, map, check;
    static int n, x, sum;
    public static void main(String[] args){
	BufferedReader sc=new BufferedReader(new InputStreamReader(System.in));
	try {
	    prime = new int[1000001];
	    sieve();
	    while(true){
		String[] st = sc.readLine().split(" ");
		n = Integer.valueOf(st[0]);
		x = Integer.valueOf(st[1]);
		if(n==0 && x==0)
		    break;
		map = new int[n];
		for(int i=0; i<n; i++)
		    map[i] = Integer.valueOf(sc.readLine());
		check = new int[x+1];
		sum = 0;
		solve();
		String out = "NA";
		for(int i=x; i>=0; i--)
		    if(check[i]==1 && prime[i]==0){
			out = String.valueOf(i);
			break;
		    }
		System.out.println(out);
	    }
	}catch(Exception e){
	    System.out.println("Error");
	}
    }
    static void solve(){
	check[0] = 1;
	for(int i=0; i<=x; i++)
	    if(check[i]==1)
		for(int j=0; j<n; j++)
		    if(i+map[j]<=x)
			check[i+map[j]] = 1;
    }
    static void sieve(){
	prime[0] = 1; prime[1] = 1;
	for(int i=2; i<1000; i++)
	    if(prime[i]==0)
		for(int j=i*i; j<1000000; j+=i)
		    prime[j] = 1;
    }
}

上司のおごり

会津太郎さんの会社には、割り切れない事が大嫌いな上司がいます。太郎さんがその上司と食事に行くときは、割り勘で会計をしているのですが、支払金額が参加人数で割り切れないときは、いつも上司がおごってくれています。

ある日、太郎さんは食事会の幹事になりました。お金の少ない太郎さんは、その上司を誘ってなんとかおごってもらえるように出来ないか考えました。もう料理屋に注文をしなければならないのですが、まだ何人参加するかは分からないので、どんな人数が参加してもおごってもらえるような注文をしておきたいようです。太郎さんの同期で、同じく食事会に参加する予定のあなたは、太郎さんに協力して、予算額以下で最大のどんな人数でも割り切れない金額を算出することにしました。

料理の種類、各料理の料金、予算額を入力とし、予算額以下で最大のどんな数字でも割り切れない合計金額(ただし、 1 と合計金額は除く)を出力するプログラムを作成してください。なお、各種類の料理は複数個注文できますが、全種類の料理を注文する必要はありません。ただし、このような合計金額がない場合は、 NA と出力してください。

Input

複数のデータセットの並びが入力として与えられます。 入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

n x
v1
v2
:
vn

1 行目に料理の種類 n (1 ≤ n ≤ 30) と予算額 x (1 ≤ x ≤ 1000000) が空白区切りで与えられます。続くn 行に i 種類目の料理の金額を表す整数 vi (1 ≤ vi ≤ 1000000) が与えられます。

データセットの数は 100 を超えません。

Output

入力データセットごとに、予算額に最も近い合計金額、または NA を１行に出力します。

Sample Input

4 15000
305
260
129
500
3 400
10
20
30
3 200909
5
9
12
0 0

Output for the Sample Input

14983
NA
200909