用打表的方法来做,原理类似素数筛
单次运行时间复杂度较高,但查询次数越多平均效率越高

#include<iostream>
#include<map>
using namespace std;

int main(){
    int n;
    map<int,bool> record;
    for(int i=2;i<10000;i++){
        record[i] = false;
    }
    for(int k=2;k<100;k++){
        int d = k*k;
        for(int i=1;d*i<10000;i++){
            record[d*i] = true;
        }
    }
    
    
    
    while(cin>>n){
        if(n==0) break;
        
        if(record[n]){
            cout<<"Yes"<<endl;
        } else {
            cout<<"No"<<endl;
        }
    }
    
    
    return 0;
}