牛客练习赛128(上)

news2024/12/23 16:44:15

Cidoai的幂次序列

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <bits/stdc++.h>
using namespace std;
signed main(){
    long long n,k;
    cin>>n>>k;
    cout<<2<<'\n';
    cout<<n-1<<' '<<1<<'\n';
    return 0;
}

代码思路

一、整体思路

  1. 输入部分:通过 cin>>n>>k; 从标准输入读取两个正整数 n 和 k,分别代表题目中的给定数值和序列长度的上限约束条件。

  2. 输出部分:首先输出 2,表示构造的正整数序列 a 的长度为 2。接着输出 n - 1 和 1,这两个数构成了满足题目条件的序列 a 的两个元素。

二、原理分析

  1. 输出序列长度为 2 的合理性:题目中给定序列长度 m 的范围是 2≤m≤k,这里选择输出长度为 2 是一种较为简单直接的策略,在满足题目条件的同时尽量简化输出。

  2. 选择输出 n - 1 和 1的原因

    • 根据题目要求,需要构造一个正整数序列 a,使得 ∑(i=0 到 m - 1) a[i]^a[(i + 1)mod m] = n
    • 当输出 n - 1 和 1时,计算可得:
      • (n - 1)^1 + 1^(n - 1) = n - 1 + 1 = n,满足题目要求的等式条件。
    • 同时,题目中规定所有 a[i] 都有 0 < a[i] ≤ n,输出的 n - 1 和 1都满足这个条件。

Cidoai的映射数列

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector>

using namespace std;
typedef long long LL;

const LL p = 998244353;

struct Matrix {
    vector<vector<LL>> mat;
    Matrix(LL size) { mat.resize(size, vector<LL>(size, 0)); }
};

Matrix multiplyMatrices(const Matrix& m1, const Matrix& m2, LL size) {
    Matrix result(size);
    for (LL i = 0; i < size; i++) {
        for (LL j = 0; j < size; j++) {
            for (LL k = 0; k < size; k++) {
                result.mat[i][j] = (result.mat[i][j] + m1.mat[i][k] * m2.mat[k][j]) % p;
            }
        }
    }
    return result;
}

int main() {
    vector<vector<Matrix>> f(8);
    for (LL d = 0; d <= 7; d++) {
        LL m = 1 << d;
        f[d].resize(61, Matrix(m));
        for (LL i = 0; i < m; i++) {
            f[d][0].mat[i][(i * 2 + 1) % m] = 1;
            for (LL j = 0; j < d; j++) {
                if ((i >> j) & 1) {
                    f[d][0].mat[i][(i - (1 << j)) * 2 % m] = 1;
                }
            }
        }
        for (LL i = 1; i <= 60; i++) {
            f[d][i] = multiplyMatrices(f[d][i - 1], f[d][i - 1], m);
        }
    }
    LL t;
    cin >> t;
    while (t--) {
        LL n, d;
        cin >> n >> d;
        LL m = 1 << d;
        vector<LL> ff(m, 0);
        ff[0] = 1;
        for (LL i = 0; i <= 60; i++) {
            if ((n >> i) & 1) {
                vector<LL> g(m, 0);
                for (LL j = 0; j < m; j++) {
                    for (LL k = 0; k < m; k++) {
                        g[k] = (ff[j] * f[d][i].mat[j][k] + g[k]) % p;
                    }
                }
                ff = g;
            }
        }
        LL ans = 0;
        for (LL i = 0; i < m; i++) {
            ans = (ans + ff[i]) % p;
        }
        cout << ans << endl;
    }
    return 0;
}

代码思路

一、整体思路

  1. 矩阵快速幂部分
    • 通过预处理一系列矩阵 f,其中 f[d][i] 表示在特定条件下的矩阵状态。这里的 d 取值从 0 到 7,可能与某种特定的分类或参数有关;i 表示步数或幂次。
    • 对于每个 d,首先初始化 m = 1 << d,即 2 的 d 次方,这个 m 可能代表矩阵的大小。然后初始化 f[d][0] 的矩阵元素,根据特定的规则进行赋值。接着通过矩阵快速幂的方法,不断地将 f[d][i] 更新为 f[d][i - 1] 自乘的结果,即 f[d][i]=multiplyMatrices(f[d][i - 1], f[d][i - 1], m)
  2. 处理输入部分
    • 读取输入的询问次数 t。然后对于每次询问,读取整数 n 和 d。接着重新计算 m = 1 << d
    • 初始化数组 ff,并将 ff[0] 设为 1。然后通过位运算判断 n 的二进制表示中特定位置是否为 1,如果是,则进行一系列矩阵运算来更新 ff 数组。
    • 最后,通过遍历 ff 数组计算答案 ans,并输出。

二、原理详解

  1. 矩阵快速幂

    • 矩阵乘法部分:对于两个矩阵 m1 和 m2,以及矩阵大小 size,通过三层循环实现矩阵乘法。外层的两个循环遍历结果矩阵的行和列,最内层的循环遍历中间的矩阵索引 k,根据矩阵乘法的定义计算结果矩阵的每个元素。每次计算结果时都对 p = 998244353 取模,以保证结果在给定的范围内。
    • 快速幂部分:通过不断地将矩阵自乘,实现了类似于整数快速幂的效果。这样可以在对数时间内计算出矩阵的高次幂,提高了计算效率。
  2. 处理输入与更新 ff 数组

    • 读取输入的 n 和 d 后,根据 d 计算出矩阵大小 m
    • ff 数组的作用可能是存储某种中间状态或结果。初始时将 ff[0] 设为 1,然后根据 n 的二进制表示进行更新。如果 (n >> i) & 1 为真,说明 n 的二进制表示在第 i 位为 1,此时进行一系列矩阵运算来更新 ff 数组。具体来说,先初始化一个临时数组 g,然后通过三层循环计算 g[k],这里的计算过程涉及到之前预处理的矩阵 f[d][i] 和当前的 ff 数组。最后将 ff 更新为 g
  3. 计算答案 ans:遍历更新后的 ff 数组,将所有元素相加并对 p 取模,得到最终的答案 ans。这个答案可能代表了满足特定条件的某种数量或结果。

Cidoai的数论求和

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector>
#include <cmath>
#include <numeric>
#include <chrono>
#include <cassert>

using namespace std;
using u32 = uint32_t;
using u64 = uint64_t;

vector<bool> is_not_prime;
vector<u32> primes;
vector<int> mu, phi;

void sieve(int N) {
    is_not_prime.resize(N + 1);
    mu.resize(N + 1);
    phi.resize(N + 1);
    mu[1] = 1;
    phi[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (!is_not_prime[i]) {
            primes.push_back(i);
            mu[i] = -1;
            phi[i] = i - 1;
        }
        for (int p : primes) {
            if (i * p > N) break;
            is_not_prime[i * p] = true;
            if (i % p == 0) {
                mu[i * p] = 0;
                phi[i * p] = phi[i] * p;
                break;
            } else {
                mu[i * p] = -mu[i];
                phi[i * p] = phi[i] * (p - 1);
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    u64 N;
    cin >> N;
    if (N < 200) {
        int ans = 0;
        for (int n = 1; n <= N; n++) {
            for (int j = 1; j <= n; j++) {
                int x = n + j;
                int y = n * j;
                if (y % x == 0 && gcd(gcd(n, j), y / x) == 1) {
                    ans++;
                }
            }
        }
        cout << ans * 2 - 1 << '\n';
        return 0;
    }
    int sqrtN = sqrt(N);
    while ((u64)(sqrtN + 1) * (sqrtN + 1) <= N) {
        sqrtN++;
    }
    sieve(sqrtN);
    vector<u64> z(sqrtN + 1);
    for (int i = 2; i <= sqrtN; i++) {
        z[i] = N / i - i;
    }
    u64 ans = 1;
    int minPos = -1;
    for (int i = 2; i <= sqrtN; i++) {
        if (i * 2 > N / i) {
            minPos = i;
            break;
        }
        ans += phi[i];
    }
    for (int i = 1; i <= sqrtN; i++) {
        if (mu[i] == 0) continue;
        int j = (minPos + i - 1) / i * i;
        while (j <= sqrtN) {
            ans += mu[i] * (z[j] / i);
            j += i;
        }
    }
    ans = 2 * ans - 1;
    cout << ans << '\n';
    return 0;
}

代码思路

一、整体思路

  1. 对于输入的正整数 N,首先判断如果 N 小于 200,则通过三重循环暴力枚举的方式计算满足特定条件的情况数量,然后输出结果。
  2. 如果 N 不小于 200,则使用筛法(这里具体是线性筛)预处理出小于等于 sqrt(N) 的所有质数,并计算莫比乌斯函数 mu 和欧拉函数 phi
  3. 接着通过一些复杂的数学推导和计算,最终得到结果并输出。

二、具体步骤原理

  1. 筛法预处理(函数 sieve

    • 首先,初始化三个容器:is_not_prime 用于标记一个数是否为合数,primes 用于存储所有找到的质数,mu 和 phi 分别用于存储莫比乌斯函数值和欧拉函数值。
    • 然后从 2 开始遍历到 N,对于每个数 i:如果 i 不是合数(即 is_not_prime[i] 为 false),则将 i 加入质数列表 primes,并初始化 mu[i] 为 -1(质数的莫比乌斯函数值为 -1),phi[i] 为 i - 1(质数的欧拉函数值为自身减 1)。接着遍历已找到的质数 p,如果 i * p 超过 N,则跳出循环。如果 i 能被 p 整除,那么根据数学性质,此时 mu[i * p] 为 0,phi[i * p] 等于 phi[i] * p;如果 i 不能被 p 整除,那么 mu[i * p] 为 -mu[i]phi[i * p] 等于 phi[i] * (p - 1)
  2. 主函数处理(main 函数)

    • 首先,读取输入的正整数 N。如果 N 小于 200,则通过暴力枚举的方式求解。具体来说,对于每个 n 从 1 到 N,再对每个 j 从 1 到 n,计算 x = n + j 和 y = n * j,如果 y % x == 0(即 y 能被 x 整除)且三个数 nj 和 y / x 的最大公约数为 1,则计数器 ans 加一。最后输出 ans * 2 - 1
    • 如果 N 不小于 200:计算 sqrtNN 的平方根取整),并在必要时进行调整,使得 (sqrtN + 1) * (sqrtN + 1) 严格大于 N。调用 sieve(sqrtN) 预处理出小于等于 sqrtN 的质数以及相关函数值。初始化一个向量 z,对于 i 从 2 到 sqrtN,计算 z[i] = N / i - i。初始化结果 ans 为 1,并找到一个 minPos,使得对于 i 大于等于 minPos,满足 i * 2 > N / i。对于 i 从 2 到 sqrtN,如果 mu[i] 不为 0,则进行特定的计算。具体是通过一个循环找到合适的 j,并更新 ans 的值。最后输出 2 * ans - 1

三、数学原理

  1. 莫比乌斯函数 mu 和欧拉函数 phi 在数论中有重要的性质和应用。莫比乌斯函数在一些数论问题中用于计数和判别性质,欧拉函数则与互质的数的个数有关。
  2. 代码中的各种计算和推导可能基于特定的数论公式和性质,通过巧妙地利用这些函数和数学关系,来高效地求解问题。具体的数学推导过程可能比较复杂,需要深入的数论知识才能完全理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…

CMake构建学习笔记16-使用VS进行CMake项目的开发

文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论 在之前的系列博文中&#xff0c;我们学习了如何构建第三方的依赖库&#xff0c;也学习了如何去组建自己的CMake项目&#xff0c;尤其是学习了CMake的核心配…

分享六款小众宝藏软件,建议收藏!

分享6款小众却实用的宝藏电脑软件&#xff0c;个个都有独特的作用&#xff0c;可以提高效率、提升体验感&#xff01; 1.Clover 一个超轻量级的文件夹管理工具&#xff0c;跟 Windows 资源管理器差不多。但用 Clover 感觉就像用 Chrome 来整理文件似的。 它最棒的功能就是能像…

【python计算机视觉编程——10.OpenCV】

python计算机视觉编程——10.OpenCV 10.OpenCV10.2 OpenCV基础知识10.2.1 读取和写入图像10.2.2 颜色空间10.2.3 显示图像及结果 10.3 处理视频10.3.1 视频输入10.3.2 将视频读取到NumPy数组中 10.4 跟踪10.4.1 光流10.4.2 Lucas-Kanade算法使用跟踪器使用发生器 10.5 更多示例…

计算架构模式之负载均衡技巧

通用负载均衡算法 负载均衡算法 -轮询 & 随机 如果服务器挂掉了&#xff0c;那么负载均衡器还是可以感知到的&#xff0c;因为连接已经断掉了。 负载均衡算法-加权轮询 假设你有4核的和8核的&#xff0c;由于你的程序没有办法跑完CPU&#xff0c;那么有可能出现4核的和8核…

xmake vscode+clangd实现c/c++程序更精确跳转、补全

clangd相比与vscode自带的c/c插件要好用很多&#xff0c;使用xmake搭配vscode开发c/c程序时&#xff0c;可以通过下面方法使用clangd。 生成compile_commands.json 好像是叫什么compile database&#xff0c;xmake可以使用下面两种方式生成。 1、手动生成 xmake project -k…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令&#xff0c;添加索引成功后&#xff0c;内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

九九乘法表-for-python

for i in range(1, 10):for j in range(1, i):print(f"{j}*{i}{i*j}\t", end )print()运行结果截图&#xff1a;

Linux 离线安装 Docker

一、安装 docker 1. 下载 Docker 安装包 https://download.docker.com/linux/static/stable/x86_64/ 2. 解压安装包 tar -xvf docker-27.1.0.tgz mv docker/* /usr/bin/3. 将 docker 注册为 service 服务 vim /etc/systemd/system/docker.servicedocker.service [Unit] Des…

学习笔记 韩顺平 零基础30天学会Java(2024.9.14)

P547 Collections工具类2 P554 泛型引入 P555 泛型入门 ArrayList<Dog>arrayList new ArrayList<Dog>()//在这里可以理解为这个arrayList里面只能放Dog类型&#xff0c;就是限制了类型 P556 泛型说明 泛型就是可以代指一类数据类型&#xff0c;可以是Integer也可以…

哪个虚拟机软件在 Mac 上更好用,Mac 虚拟机会影响性能吗?

虚拟机如今已经成为许多用户工作生活不可缺少的工具之一&#xff0c;尤其是对于需要经常切换使用不同系统的用户来说&#xff0c;虚拟机提供了一个便捷而有效的操作平台&#xff0c;解决用户跨系统工作的问题。然而&#xff0c;当我们考虑在Mac上下载运行虚拟机时&#xff0c;会…

艾体宝洞察丨一文读懂最新密码存储方法,揭秘密码存储常见误区!

在信息安全的诸多领域之中&#xff0c;密码的安全存储无疑已然成为最为核心的问题之一。随着攻击技术的不断演进&#xff0c;传统的密码存储方法已无法抵御现代复杂的威胁。更为安全、健壮的密码存储机制也成为当代信息安全从业者的关注点。本篇文章将引入并介绍密码存储中的基…

交叉编译工具链的安装及带wiringPi库的交叉编译实现

交叉编译工具链的安装及带wiringPi库的交叉编译实现 交叉编译的概念交叉编译工具链的安装下载交叉编译工具链配置环境遍变量编译程序到ARM平台 带wiringPi库的交叉编译下载编译wiringPi库调用树莓派的wringPi库 交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行…

【资料分析】平均倍数类

平均 观察选项&#xff0c;差距较大&#xff0c;大胆约分即可 很少的情况下&#xff0c;选项相差很近不能随便约分 倍数 第N次注意增长率是否为下降&#xff01; 问的是基期倍数比哦 平均增长量 十三五这种明确问法&#xff0c;一定是五年 属于有往前推的A和不往前推的…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

掌握Transformer之深入多头注意力机制

01 引言 这是我关于Transformer系列的第三篇文章。在在前两篇文章中&#xff0c;我们了解了什么是Transformer、Transformer的架构以及其各组件的工作原理。在本文中&#xff0c;我们将进一步深入探讨多头注意力机制&#xff0c;它是Transformer的大脑。 闲话少说&#xff0…

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

福建聚鼎科技:装饰画怎么运营更受大家喜欢

在繁华喧嚣的都市中&#xff0c;装饰画宛如一首无言的诗篇&#xff0c;静静地诉说着生活的美好。如何让这门艺术走进千家万户&#xff0c;成为装点空间、启迪心灵的一抹亮色?今天&#xff0c;我们就来探寻装饰画运营的秘诀&#xff0c;让它在市场的海洋中乘风破浪。 一幅优秀的…

Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?

1、新增"conftest.py" import pytest import loggingfrom api_keyword.api_key import ApiKey from config import *# 获取token # 1. 正常的请求对应的接口并且提取数据 # 2. pytest.fixture()测试夹具&#xff08;测试前置、后置操作&#xff09;pytest.fixture(s…

黑神话悟空+云技术,游戏新体验!

近期&#xff0c;一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案&#xff0c;正在改变人们的游戏体验方式&#xff0c;使得高性能游戏可以在更多设备上流畅运行。 那么&#xff0c;黑神话悟空如…