/* 令F(1)=1,F(N)=∑F(d)%2 (d|N 且d!=N) F(N)=1,则N在数组里。(除了1以外) 1.对于N=P^a F(P)=F(1)=1,F(P*P)=F(1)+F(P)=0,F(P^a)=F(1)+F(P)+……F(P^(a-1))=F(1)+F(P)=0; 2.对于N=P^a Q^b a=1时 b=1 F(N)=F(1)+F(P)+F(Q)=1 b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)=0 b>2 归纳法 对b归纳 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+……+F(P×Q^(b-1))=F(1)+F(P)+F(Q)+F(P×Q); a=2时 b=1 F(N)=0 b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+F(P^2*Q)+F(Q^2*P)=0 b>2 归纳法 对b归纳 F(N)=∑F(P^2×Q^i)(1<i<b)+∑F(P×Q^i)(1<i<=b)=0+0=0 a>2时 b=1 F(N)=0 b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+F(P^2*Q)+F(Q^2*P)=0 b>2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+∑F(P^i×Q^j)(1=<i<a,1=<j<=b)+∑F(P^a×Q^j)(1=<j<b) =F(1)+F(P)+F(Q)+F(P×Q)+0+0=0 3.我们假设 N=P1^a1……Pk^ak 满足仅当a1=……=ak=1时 F(N)=1 则N=P1^a1……P(k+1)^a(k+1)时 1)当a1=……=ak=a(k+1)=1时 F(N)=F[1]+∑F(Pt1)+∑F(Pt1×Pt2)+∑F(Pt1*Pt2*Pt3)……+∑F(Pt1*Pt2*Pt3*……Ptk) =F[1]+C[K+1,1]+C[K+1,2]+……+C[k+1,k]=2^(k+1)-1=1 2)当at>1时 F(N)=F[1]+∑F(Pt1)+∑F(Pt1×Pt2)+∑F(Pt1*Pt2*Pt3)…+∑F(Pt1*Pt2*Pt3*…Ptk)+F(P1*P2*P3*……P(k+1)) =F[1]+C[K+1,1]+C[K+1,2]+……+C[k+1,k]+C[k+1,k+1]=0 由归纳法~可知 N=P1^a1……Pk^ak 满足仅当a1=……=ak=1时 F(N)=1 */ import java.util.*; import java.math.*; import java.io.*; public class Main { static Scanner cin = new Scanner(new BufferedInputStream(System.in)); static final int N = 1300000; static boolean hash[] = new boolean[N]; static int prime[] = new int[130000]; static int m; public static void main(String[] args) { BigInteger a; Prime(); while (cin.hasNext()) { a = cin.nextBigInteger(); if (a.equals(BigInteger.ZERO)) break; if (a.equals(BigInteger.ONE)) { System.out.println("no"); } else { if (Hxsh(a)) { System.out.println("yes"); } else { System.out.println("no"); } } } } static boolean factor(BigInteger n) { int i = 0; BigInteger x = BigInteger.valueOf(prime[0] * prime[0]); for (i = 0; x.compareTo(n) < 1;) { BigInteger y = BigInteger.valueOf(prime[i]); BigInteger z = n.mod(y); if (z.compareTo(BigInteger.ZERO) == 0) { int s = 0; while (z.compareTo(BigInteger.ZERO) == 0) { n = n.divide(y); s++; if (s > 1) return false; z = n.mod(y); } } i++; x = BigInteger.valueOf(prime[i] * prime[i]); } return true; } static void Prime() { m = 0; Arrays.fill(hash, (boolean) false); hash[1] = true; int temp = (int) Math.sqrt(1.0 * N); for (int i = 2; i < temp; i++) if (!hash[i]) for (int j = i + i; j < N; j += i) hash[j] = true; for (int i = 2; i < N; i++) if (!hash[i]) prime[m++] = i; // System.out.println(m); } static boolean Hxsh(BigInteger a) { for (int i = 0; i < m && BigInteger.valueOf(prime[i]).compareTo(a) != 1; i++) { int flag = 0; // System.out.println(i); BigInteger xi = a.mod(BigInteger.valueOf(prime[i])); // System.out.println(xi); // System.out.println(prime[i]); while (xi.compareTo(BigInteger.ZERO) == 0) { a = a.divide(BigInteger.valueOf(prime[i])); // System.out.println(a); flag++; if (flag > 1) return false; xi = a.mod(BigInteger.valueOf(prime[i])); // System.out.println(xi); } } return true; } }