题意:猜数游戏变种。先选好猜的数,对方会告诉你他想的那个数(1-n)能不能整除你猜的数,问最少猜几个数能保证知道对方想的数是多少?
对一个质数p,如果p^x不猜,那么就无法区分p^(x-1)和p^x,因此所有p^x如果小于等于n都要猜。
乱码:
#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> using namespace std; const int SZ=200010,INF=0x7FFFFFFF; vector<int> pri; bool isp[SZ]; void init(int n) { memset(isp,1,sizeof(isp)); isp[0]=isp[1]=0; for(int i=2;i*i<SZ;++i) { if(isp[i]) for(int j=i*i;j<SZ;j+=i) { isp[j]=0; } } for(int i=0;i<=n;++i) { if(isp[i]) { pri.push_back(i); } } } int main() { std::ios::sync_with_stdio(0); int n; cin>>n; init(n); vector<int> res; for(int i=2;i<=n;++i) { if(isp[i]) { for(int j=i;j<=n;j*=i) { res.push_back(j); } } } cout<<res.size()<<endl; for(int i=0;i<res.size();++i) { if(i)cout<<" "; cout<<res[i]; } cout<<endl; return 0; }