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] << " ";;
	}
}
posted @ 2022-07-11 22:03  腾云今天首飞了吗  阅读(19)  评论(0编辑  收藏  举报