每日羊题 (质数筛 + 数学 | 构造 + 位运算)

Problem - E - Codeforces

思路:

一眼质数筛,但是需要发现题目的一些小细节

题目说到 i j 只要满足 i % j == 0 或 j % i == 0 一个就能连边,所以我们直接输出 质数数量 是错的,考虑分成两部分

①.

对于此部分的所有数 x,我们都能和 2*x 连边,因此这些数不需要额外的边

②.

对于此部分的所有数 x,我们只能去往小于 x 的部分连边,因为最小的 2*x 不在 1 ~ n 范围内,那么这部分的质数显然就没有连边,即需要连边

所以答案就是 cntn - cntn/2,其中 cnti 代表 1 ~ i 中含有的质数数量

最后特判 n = 2 和 n = 3 这两个会多计算 2 的情况即可

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

vector<int> p;
int nop[10000005];
int cnt[10000005];

void init()
{
    nop[1] = nop[0] = 1;
    for (int i = 2; i <= 10000000; i++)
    {
        if(!nop[i]) p.push_back(i);
        for(int j = 0;j < p.size() && p[j] * i <= 10000000;j++)
        {
            nop[i * p[j]] = 1;
            if(i % p[j] == 0) break;
        }
        cnt[i] = p.size();
    }
}

void solve()
{
    int n;
    cin >> n;
    if(n == 2)
    {
        cout << 0 << endl;
        return;
    }
    if(n == 3)
    {
        cout << 1 << endl;
        return;
    }
    cout << cnt[n] - cnt[n/2] << endl;
}

signed main()
{
    init();
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

Problem - F - Codeforces

思路:

首先一眼就能看出我们选的数只能是 a 的子集,且 b 必须也是 a 的子集,否则无解

所以先特判特殊情况:如果 a == b == 0,那么就只能为 0,如果 b 不是 a 的子集,那么无解

接下来考虑正常情况

如果 a 的二进制位中只含有一个 1,那么此时我们只能填 0 和 a,同时我们肯定不能只填 0,所以必须两个都填,因此 b 必须等于 a 才有解,否则无解

如果 a 的二进制位中含有多余一个 1(假设为 k),那么此时我们能选 个数,同时注意到一个性质,此时这些数的异或和为 0

证明如下:对于任意一个 1,我们都有 种可能分配别的位置的数,所以这一位最后异或绝对是 0,而对于每一位我们都有这样的结论,因此最后每一位异或都是 0,所以结果为 0,得证

那么此时如果 b = 0,那么这 个数我们都能选,否则我们就删掉 b,即选剩下 个数,显然此时数量是最多的

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

void solve()
{
    int a, b;
    cin >> a >> b;
    if ((a & b) != b)
    {
        cout << "-1\n";
        return;
    }
    if (a == 0 && b == 0)
    {
        cout << "1\n";
        cout << "0\n";
        return;
    }
    int cnt = 0;
    for (int i = 0; i < 31; i++)
    {
        if (a >> i & 1)
            cnt++;
    }
    if (cnt == 1)
    {
        if (b == a)
        {
            cout << "2\n";
            cout << 0 << " " << a << endl;
        }
        else
        {
            cout << "-1\n";
        }
        return;
    }
    vector<int> ans;
    for (int i = 0; i <= a; i++)
    {
        if ((a & i) == i)
        {
            ans.push_back(i);
        }
    }
    if (b == 0)
    {
        cout << ans.size() << endl;
        for (int i = 0; i < ans.size(); i++)
        {
            cout << ans[i] << " ";
        }
    }
    else
    {
        cout << ans.size() - 1 << endl;
        for (int i = 0; i < ans.size(); i++)
        {
            if (ans[i] == b)
                continue;
            cout << ans[i] << " ";
        }
    }
    cout << endl;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
相关推荐
C++ 老炮儿的技术栈40 分钟前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_4480111642 分钟前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据1 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
leisoo80971 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
zlinear数据采集卡1 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai2 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间2 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋2 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
qz_Serene3 小时前
C++:类和对象(上)
开发语言·c++
西安景驰电子3 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php