基本上就是一个结论题,然后wiki一下就出了
// csu 1416
// by utoppia
// http://planetmath.org/PracticalNumber
// http://en.wikipedia.org/wiki/Practical_number
// http://oeis.org/A005153
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
typedef long long LL;
int const nMax = 1000010;
int p[nMax],vis[nMax],k;
void init(){
for(int i=2;i<10010;i++) if(!vis[i]) {
p[k++] = i;
for(int j=i*i;j<nMax;j+=i) vis[j]=1;
}
for(int i=10010;i<nMax;++i) if(!vis[i]) p[k++] = i;
}
int ck(LL n) {
if(n==1 || n==2) return 1;
if(n%2==1) return 0;
LL tmp = 2LL,add;
while(n%2==0) {
tmp *= 2;
n /= 2;
}
tmp -= 1LL;
for(int i=1;i<k && p[i]<=n;++i) if(n%p[i]==0) {
if(p[i]>tmp+1) return 0;
add = (LL)p[i];
while(n%p[i]==0) {
add*=p[i];
n/=p[i];
}
add -= 1;
add /= (p[i]-1);
tmp *= add;
if(tmp >= n) return 1;
}
if(n>tmp+1) return 0;
return 1;
}
int main() {
init();
int T;
cin >> T;
LL n;
while(T--) {
cin >> n;
if(ck(n)) printf("Yes\n");
else printf("No\n");
}
return 0;
}
//