CF576A Vasya and Petya's Game
题目大意:
给定一个数字 n,现在 Vasya 要从 1∼n 中想一个数字 x。
Petya 向 Vasya 询问 “x 是否能整除 y?” ,通过 Vasya 的回答来判断 x 的答案。
Petya 的问题一开始就已经准备好,他必须将所有问题都问一遍,不管他当前需不需要问。
他想知道无论 Vasya 想出任何的 x, 最少要准备多少次询问 y 的问题才能猜中 x,并输出一组具体方案。 n≤1000
题解:
不知道怎么说。。。。就是寻找1~n中的所有质数,然后再把计算所有质数不大于n的所有幂,以上所计算的数就是最终答案
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
bool vis[MAXN + 5];
vector<int> prime;
int n;
int main(){
cin >> n;
for(int i = 2; i <= n; i++){//线性筛法求质数
if(!vis[i])prime.push_back(i);
for(int j = 0; i * prime[j] <= n; j++){
vis[i * prime[j]] = 1;
if(i % prime[j] == 0)break;
}
}
memset(vis,0,sizeof vis);
for(int i = 0; i < prime.size(); i++){
int now = prime[i];
while(now * prime[i]<= n){
now *= prime[i];//计算所有幂并加入到答案中
if(!vis[now])prime.push_back(now);
vis[now] = 1;
}
}
cout << prime.size() << "\n";
for(int i = 0; i < prime.size(); i++){
cout << prime[i] << " ";;
}
}