CSU 1416 Practical Number
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416
结论题,具体判断方法请点击这个网址。
筛素数是肯定的,但一开始定的范围太大了,想当然要筛到10^9的质数,但仔细想想,只要到sqrt(10^9)就可以了,最后的那一个质数是最后一步的比较,不用筛出来。
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define N 100005 typedef long long LL; bool vis[N]; int p[N], k=0; void get_prime() { for(int i = 2; i < N; i++) { if(!vis[i]) { p[k++] = i; for(int j = i + i; j < N; j += i) vis[j] = 1; } } } bool ok(LL n) { if(n == 1) return 1; if(n&1) return 0; LL al = 1; for(int i = 0; i < k; i++) { if(n % p[i] == 0) { if(p[i] > al + 1 && p[i] != 2) return 0; LL s = 1; LL tmp = 1; while(n%p[i] == 0) { n /= p[i]; tmp *= p[i]; s += tmp; } al *= s; } } if(n > al + 1) return 0; return 1; } int main() { int t; LL n; get_prime(); cin >> t; while(t--) { cin >> n; if(ok(n)) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }