AOJ0142 Nature of Prime Numbers

問題リンク Nature of Prime Numbers

  • 解法

初めに2乗をnで割った余りとして出てくる数をリストアップします。
リストアップしたものの中から2個を選んで差の計算をし、カウントします。

  • ソース
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

//Nature of Prime Numbers
public class AOJ0142 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			if(n==0)break;
			int[] c = new int[(n-1)/2+1];
			int[] a = new int[n];
			int id = 0;
			Set<Integer> set = new HashSet<Integer>();
			for(int i=1;i<n;i++){
				int x = i*i%n;
				if(!set.contains(x)){
					set.add(x);
					a[id++] = x;
				}
			}
			for(int i=0;i<id;i++){
				for(int j=0;j<id;j++){
					if(i==j)continue;
					int sub = a[i]-a[j];
					if(sub<0)sub+=n;
					if(sub > (n-1)/2)sub = n-sub;
					c[sub]++;
				}
			}
			for(int i=1;i<=(n-1)/2;i++)System.out.println(c[i]);
		}
	}
}