/*<br />令F(1)=1,F(N)=∑F(d)%2 (d|N 且d!=N)<br />F(N)=1,則N在數組裡。(除了1以外)<br />1.對於N=P^a<br /> 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;<br />2.對於N=P^a Q^b<br /> a=1時 b=1 F(N)=F(1)+F(P)+F(Q)=1<br /> b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)=0<br /> b>2 歸納法 對b歸納<br /> 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);<br /> a=2時 b=1 F(N)=0<br /> b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+F(P^2*Q)+F(Q^2*P)=0<br /> b>2 歸納法 對b歸納<br /> F(N)=∑F(P^2×Q^i)(1<i<b)+∑F(P×Q^i)(1<i<=b)=0+0=0<br /> a>2時 b=1 F(N)=0<br /> b=2 F(N)=F(1)+F(P)+F(Q)+F(P×Q)+F(P^2*Q)+F(Q^2*P)=0<br /> 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<br />3.我們假設 N=P1^a1……Pk^ak 滿足僅當a1=……=ak=1時 F(N)=1<br /> 則N=P1^a1……P(k+1)^a(k+1)時<br /> 1)當a1=……=ak=a(k+1)=1時<br /> F(N)=F[1]+∑F(Pt1)+∑F(Pt1×Pt2)+∑F(Pt1*Pt2*Pt3)……+∑F(Pt1*Pt2*Pt3*……Ptk)<br /> =F[1]+C[K+1,1]+C[K+1,2]+……+C[k+1,k]=2^(k+1)-1=1<br /> 2)當at>1時<br /> 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))<br /> =F[1]+C[K+1,1]+C[K+1,2]+……+C[k+1,k]+C[k+1,k+1]=0<br />由歸納法~可知 N=P1^a1……Pk^ak 滿足僅當a1=……=ak=1時 F(N)=1<br /> */<br />import java.util.*;<br />import java.math.*;<br />import java.io.*;<br />public class Main {<br />static Scanner cin = new Scanner(new BufferedInputStream(System.in));<br />static final int N = 1300000;<br />static boolean hash[] = new boolean[N];<br />static int prime[] = new int[130000];<br />static int m;<br />public static void main(String[] args) {<br />BigInteger a;<br />Prime();<br />while (cin.hasNext()) {<br />a = cin.nextBigInteger();<br />if (a.equals(BigInteger.ZERO))<br />break;<br />if (a.equals(BigInteger.ONE)) {<br />System.out.println("no");<br />} else {<br />if (Hxsh(a)) {<br />System.out.println("yes");<br />} else {<br />System.out.println("no");<br />}<br />}<br />}<br />}<br />static boolean factor(BigInteger n) {<br />int i = 0;<br />BigInteger x = BigInteger.valueOf(prime[0] * prime[0]);<br />for (i = 0; x.compareTo(n) < 1;) {<br />BigInteger y = BigInteger.valueOf(prime[i]);<br />BigInteger z = n.mod(y);<br />if (z.compareTo(BigInteger.ZERO) == 0) {<br />int s = 0;<br />while (z.compareTo(BigInteger.ZERO) == 0) {<br />n = n.divide(y);<br />s++;<br />if (s > 1)<br />return false;<br />z = n.mod(y);<br />}<br />}<br />i++;<br />x = BigInteger.valueOf(prime[i] * prime[i]);<br />}<br />return true;<br />}<br />static void Prime() {<br />m = 0;<br />Arrays.fill(hash, (boolean) false);<br />hash[1] = true;<br />int temp = (int) Math.sqrt(1.0 * N);<br />for (int i = 2; i < temp; i++)<br />if (!hash[i])<br />for (int j = i + i; j < N; j += i)<br />hash[j] = true;<br />for (int i = 2; i < N; i++)<br />if (!hash[i])<br />prime[m++] = i;<br />// System.out.println(m);<br />}<br />static boolean Hxsh(BigInteger a) {<br />for (int i = 0; i < m && BigInteger.valueOf(prime[i]).compareTo(a) != 1; i++) {<br />int flag = 0;<br />// System.out.println(i);<br />BigInteger xi = a.mod(BigInteger.valueOf(prime[i]));<br />// System.out.println(xi);<br />// System.out.println(prime[i]);<br />while (xi.compareTo(BigInteger.ZERO) == 0) {<br />a = a.divide(BigInteger.valueOf(prime[i]));<br />// System.out.println(a);<br />flag++;<br />if (flag > 1)<br />return false;<br />xi = a.mod(BigInteger.valueOf(prime[i]));<br />// System.out.println(xi);<br />}<br />}<br />return true;<br />}<br />}