因为所有整数都能被唯一分解,p1^a1*p2^a2*...*pi^ai,而一次询问的数可以分解为p1^a1k*p2^a2k*...*pi^aik,这次询问会把所有a1>=a1k && a2 >= a2k &&...
a3 >= a3k的数从原来的集合中分开。ai表示pi的幂。
那么只有当这个数的素因子的最大幂都被询问过一次,这个数才能确定。因此答案是所有的不大于n的只有一个素因子的数。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e3+5; int prime[maxn]; bool vis[maxn]; int sieve(int n) { int m = sqrt(n+0.5); for(int i = 2; i <= m; i++) if(!vis[i]){ for(int j = i*i; j <= n; j+=i) vis[j] = true; } int c = 0; for(int i = 2; i <= n; i++) if(!vis[i]){ prime[c++] = i; } return c; } vector<int> ans; int main() { int tot = sieve(1000); int n; scanf("%d",&n); for(int i = 0; i < tot; i++){ int p = prime[i]; if(p > n) break; for(int t = p; t<=n; t*=p){ ans.push_back(t); } } printf("%d ",ans.size()); for(int i = 0; i < ans.size(); i++){ if(i) putchar(' '); printf("%d",ans[i]); } return 0; }