B-smooth 数
虽迟但到
题目描述
小杨同学想寻找一种名为 B-smooth 数的正整数。
如果一个正整数的最大质因子不超过 B,则该正整数为 B-smooth 数。小杨同学想知道,对于给定的 n 和 B,有多少个不超过 n 的 B-smooth 数。
输入格式
第一行包含两个正整数 n 和 B,含义如题面所示。
输出格式
输出一个非负整数,表示不超过 n 的 B-smooth 数的数量。
输入输出样例
输入 #1
10 3
输出 #1
7
说明/提示
数据规模与约定
子任务 | 得分 | n≤ | B |
---|---|---|---|
1 | 30 | ||
2 | 30 | ||
3 | 40 |
对全部的测试数据,保证 。
题目代码
普通代码
这道题看上去很水啊,很多人都会这么做(大概这样
#include<bits/stdc++.h>
using namespace std;
bool judge(int n)
{
if(n < 2) return false;
for(int i = 2; i < n; i ++)
if(n % i == 0) return false;
return true;
}
int main()
{
int n, b;
cin >> n >> b;
int cnt = 0;
for(int i = 1; i <= n; i ++)
{
int x;
for(int j = n; j >= 1; j --)
if(i % j == 0 && judge(j))
{
x = j;
break;
}
if(x <= b) cnt ++;
}
cout << cnt << endl;
return 0;
}
但是,这在GESP里,只能过四个点(我就这样),但洛谷上一个不给过(可能是我写错了,反正大概就这样
只因 筛数的时候时间太长了......
埃氏筛
埃氏筛,全称埃拉托斯特尼筛法,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
我们可以用埃氏筛,将2到根号n的数枚举,如果是素数,将它的倍数的最大质因子全部变为该数。
以样例为例:
经筛后:
由于1没有质因子,所以也算在其中。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, B;
int primes[N]; //最大质因子
int main()
{
cin >> n >> B;
for(int i = 2; i <= n; i ++)
if(!primes[i])
{
for(int j = i; j <= n; j += i)
primes[j] = i;
}
int cnt = 0;
for(int i = 1; i <= n; i ++)
if(primes[i] <= B)
cnt ++;
cout << cnt << endl;
return 0;
}
我:游戏结束)