SYZOJ - [NOIP2018模拟赛] 小P的loI(素筛)

522 篇文章 3 订阅
93 篇文章 0 订阅

题目链接:https://syzoj.com/problem/448
内存限制:512 MiB 时间限制:1000 ms

题目描述

且随疾风前行,身后亦须留心
吾虽浪迹天涯,却未迷失本心


一天小P想要玩lol,但是他太菜了,必须和他的王者学长组队才能赢。
学长此时正在解一道叫loI的问题:
N个小兵,编号为1,2,3……N,你有N种技能,第i种技能可以消灭所有编号为i+1的倍数的小兵
问最少放多少个技能可以消灭至少k个小兵
为了使小P和学长玩上lol,请你尽快解决这道题

输入格式

一行两个整数N,k,含义如题目描述

输出格式

一个整数,表示最少放多少个技能可以消灭至少k个小兵

样例输入

8 7

样例输出

4

数据范围与提示

对于30%的数据,满足k<N≤20
对于另外30%的数据,满足N≤10,000,000且k=N−1
对于100%的数据,满足k<N≤10,000,000

解题思路

类似于素筛,先用一个小的数筛掉以它为因子的数,标记,直到消灭掉k个。

#include <stdio.h>
#include <string.h>
bool vis[10000005];
int main() {
#ifndef LOCAL
    freopen("lol.in", "r", stdin);
    freopen("lol.out", "w", stdout);
#endif
    int n, k, ans, num;
    while (~scanf("%d%d", &n, &k)) {
        ans = num = 0;
        memset(vis, false, sizeof(vis));
        for (int i = 2; i <= n + 1 && num < k; i++) {
            if (!vis[i]) {
                ans++;
                for (int j = i; j <= n && num < k; j += i) {
                    if (!vis[j]) {
                        num++;
                        vis[j] = true;
                    }
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ityanger

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值