(File IO): input:game.in output:game.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
G
u
y
u
G
u
o
Guyu Guo
GuyuGuo和
T
u
b
e
L
u
Tube Lu
TubeLu正在玩一个游戏:
L
u
Lu
Lu默想一个
1
1
1和
n
n
n 之间的数
x
x
x,然后
G
u
o
Guo
Guo尝试猜出这个数。
G
u
o
Guo
Guo能提出
m
m
m个这样的问题: “未知数是否能被
y
i
yi
yi整除?”
游戏按照如下流程进行:
G
u
o
Guo
Guo先给出他想问的全部
m
m
m个问题,然后
L
u
Lu
Lu对所有问题依次以“是”或“否”作答。得到
m
m
m个问题的答案之后,
G
u
o
Guo
Guo就要给出他的猜测。
G
u
o
Guo
Guo写了一个程序帮他以最优的方式提出这
m
m
m个问题,现在他想知道在保证得到一个确定的答案下,最少可以问多少个问题,即
m
m
m的最小值。但是
G
u
o
Guo
Guo正忙于吃漂亮学姐送他的糖果而无暇改代码(送糖果的学姐十分多,以至于有许多糖果快要过期了),所以他找到了你,希望你来帮他解决这个问题。
输入
一行,一个整数
n
n
n
输出
一行,一个整数
m
m
m
样例输入
【样例输入1】
4
【样例输入2】
8
样例输出
【样例输出1】
3
【样例输出2】
6
样例
1
1
1解释:
G
u
o
Guo
Guo依次提问能否被
2
,
3
,
4
2,3,4
2,3,4整除,就可以得到确定答案。
比如Lu回答能被
2
,
4
2,4
2,4整除,不能被
3
3
3整除,则确定答案为
4
4
4
样例
2
2
2解释:
G
u
o
Guo
Guo依次提问能否被
2
,
3
,
4
,
5
,
7
,
8
2,3,4,5,7,8
2,3,4,5,7,8整除,总共需要
6
6
6次。
数据范围限制
对于
20
20%
20的数据:
1
≤
n
≤
20
1 ≤ n ≤ 20
1 ≤ n ≤ 20
对于
60
60%
60的数据:
1
≤
n
≤
1000
1 ≤ n ≤ 1000
1 ≤ n ≤ 1000
对于
100
100%
100的数据:
1
≤
n
≤
100000
1 ≤ n ≤ 100000
1 ≤ n ≤ 100000
解题思路
小于
n
n
n的质数的次方的次方和,即为所求
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long pr[100010],n,k,t,ans;
bool ch[2000000];
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
for (int i = 2; i < 100010; ++i) {//质数筛
if (!ch[i])
pr[t++] = i;
for (int j = 0; j < t; ++j) {
if (i*pr[j]>100010)
break;
ch[i*pr[j]] = 1;
if (i % pr[j] == 0)
break;
}
}
for(int i=2;i<=n;i++)
if(!ch[i])
{
k=i;
while (k<=n)
{
ans++;
k=k*i;
}
}
cout<<ans;
}