牛客挑战赛77

news2024/11/18 2:11:42

 

#include <iostream>

// 函数 kXOR:计算两个数在 k 进制下的异或和
// 参数:
//   a: 第一个正整数
//   b: 第二个正整数
//   k: 进制基数
// 返回值:
//   两数在 k 进制下的异或和(十进制表示)
long long kXOR(long long a, long long b, long long k) {
    long long result = 0;       // 存储最终结果的变量
    long long multiplier = 1;   // 用于记录 k 的权重(对应 k^0, k^1, k^2 ...)

    // 循环处理 a 和 b 的每一位,直到两者均为 0
    while (a > 0 || b > 0) {
        // 提取 a 和 b 当前最低位的 k 进制数字
        long long digitA = a % k;  // a 的最低位
        long long digitB = b % k;  // b 的最低位

        // 计算当前位的“异或”结果,实际上是 k 进制下的无进位加法
        long long xorDigit = digitA + digitB;

        // 如果当前位的和大于或等于 k,则减去 k,模拟 k 进制的循环特性
        if (xorDigit >= k) {
            xorDigit -= k;
        }

        // 将当前位的结果按权重加到最终结果中
        result += xorDigit * multiplier;

        // 移除处理过的最低位,准备处理更高位
        a /= k;
        b /= k;

        // 更新权重为当前位的 k 次幂
        multiplier *= k;
    }

    // 返回最终计算的异或和
    return result;
}

int main() {
    long long k, A, B; // 定义进制 k 和两个正整数 A, B

    // 从标准输入读取三个正整数
    std::cin >> k >> A >> B;

    // 调用 kXOR 函数计算两数在 k 进制下的异或和
    long long weight = kXOR(A, B, k);

    // 输出计算结果
    std::cout << weight << std::endl;

    return 0; // 程序正常结束
}


#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;       // 数组 a 的最大长度为 2000010
int mod = 1e9 + 7;            // 模数 10^9 + 7,用于防止结果溢出
long long a[N];               // 存储特征值的数组
long long cnt[505];           // 统计每一位上某个余数出现的次数,最大进制 k = 500

int main() {
    cin.tie(0)->sync_with_stdio(0); // 提高输入输出速度
    int n, k;
    cin >> n >> k;           // 输入数列长度 n 和进制 k
    for(int i = 1; i <= n; i++) cin >> a[i]; // 输入每个点的特征值
    
    long long bace = 1, ans = 0; // bace 表示当前位的权重,初始为 1。ans 表示总权重和
    int f = 1; // 标记是否需要处理更高位,如果所有数都变成 0,f 就会变成 0

    while(f) {
        f = 0; // 假设当前处理的是最后一位
        memset(cnt, 0, sizeof cnt); // 清空 cnt 数组,重新统计当前位

        // 统计当前位的余数分布
        for(int i = 1; i <= n; i++) {
            cnt[a[i] % k]++; // 统计当前数在 k 进制下最低位的余数
            a[i] /= k;       // 去掉最低位,为下一次循环做准备
            if(a[i]) f = 1;  // 如果去掉最低位后仍不为 0,则需要继续处理更高位
        }

        // 计算当前位的贡献
        for(int i = 0; i < k; i++) {
            // 计算同一余数(i)之间的组合的贡献
            if(cnt[i] >= 2) 
                ans = (ans + cnt[i] * (cnt[i] - 1) / 2 % mod * (2 * i % k) % mod * bace) % mod;
            
            // 计算不同余数之间的组合的贡献
            for(int j = i + 1; j < k; j++) {
                ans = (ans + cnt[i] * cnt[j] % mod * ((i + j) % k) % mod * bace) % mod;
            }
        }

        // 更新当前位的权重,进入下一位(相当于乘以 k)
        bace = (bace * k) % mod;
    }

    cout << ans << '\n'; // 输出结果
    return 0;
}

着重解释这一段代码

 for (int i = 0; i < k; i++) {
            // 计算同一余数(i)之间的组合的贡献
            if (cnt[i] >= 2) {
                ans = (ans + cnt[i] * (cnt[i] - 1) / 2 % mod * (2 * i % k) % mod * bace) % mod;
            }

            // 计算不同余数之间的组合的贡献
            for (int j = i + 1; j < k; j++) {
                ans = (ans + cnt[i] * cnt[j] % mod * ((i + j) % k) % mod * bace) % mod;
            }
        }

这段代码的目的是计算每个位上所有数的贡献值,根据它们在 k 进制下的余数分布,进行不同余数之间和相同余数之间的组合计算。具体来说,它计算了两种类型的组合贡献:

  1. 同一余数之间的组合贡献
  2. 不同余数之间的组合贡献

我们一段一段地分析这个代码。

1. 循环遍历所有可能的余数

for (int i = 0; i < k; i++) {

 该循环遍历所有可能的余数 i(从 0 k-1)。cnt[i] 记录了在当前位上余数为 i 的数的个数。

2. 计算同一余数(i)之间的组合贡献 

if (cnt[i] >= 2) {
    ans = (ans + cnt[i] * (cnt[i] - 1) / 2 % mod * (2 * i % k) % mod * bace) % mod;
}

cnt[i] 表示余数为 i 的数的个数。如果 cnt[i] >= 2,说明有两个或更多的数具有相同的余数,可以进行组合。

  • 组合的数量:从 cnt[i] 个相同余数的数中,选择两个数来进行组合。组合数是 C(cnt[i], 2),即 cnt[i] * (cnt[i] - 1) / 2

  • 贡献的计算:每一对相同余数的组合贡献为 (2 * i) % k,即这对数的贡献为 2 * ik 进制下取余后的值。

  • 权重的影响:每一对组合的贡献还需要乘以当前位的权重 bace,因为权重随着位数增加而逐渐变大。

所以,更新 ans 的公式为:

ans = (ans + cnt[i] * (cnt[i] - 1) / 2 % mod * (2 * i % k) % mod * bace) % mod;

 3. 计算不同余数(i, j)之间的组合贡献

for (int j = i + 1; j < k; j++) {
    ans = (ans + cnt[i] * cnt[j] % mod * ((i + j) % k) % mod * bace) % mod;
}

  • 这个嵌套的循环遍历了所有不同余数的对 (i, j),其中 i0k-1,而 ji+1k-1。确保每对 (i, j) 都是不同的。

  • 组合的数量:对于每对不同的余数 (i, j),组合数是 cnt[i] * cnt[j],即选择一个余数为 i 的数和一个余数为 j 的数。

  • 贡献的计算:每一对不同余数的组合贡献为 (i + j) % k,即两者余数之和的 k 进制下的值。

  • 权重的影响:每一对组合的贡献还需要乘以当前位的权重 bace

    所以,更新 ans 的公式为:

ans = (ans + cnt[i] * cnt[j] % mod * ((i + j) % k) % mod * bace) % mod;

  • 这一步计算了所有不同余数的数对的贡献。

4. 总结

  • 第一部分 if (cnt[i] >= 2) 计算的是同一余数i)之间的组合贡献,它考虑的是从同余数的数中选择两个的情况。
  • 第二部分 for (int j = i + 1; j < k; j++) 计算的是不同余数ij)之间的组合贡献。

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

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

相关文章

大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【流量分析】常见webshell流量分析

免责声明&#xff1a;本文仅作分享&#xff01; 对于常见的webshell工具&#xff0c;就要知攻善防&#xff1b;后门脚本的执行导致webshell的连接&#xff0c;对于默认的脚本要了解&#xff0c;才能更清晰&#xff0c;更方便应对。 &#xff08;这里仅针对部分后门代码进行流量…

springboot基于Web足球青训俱乐部管理后台系统开发(代码+数据库+LW)

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

mysql时间时区修改、set global、配置文件-default-time-zone

通过查看mysql错误日志或二进制日志可以看到时间和时区并不与国内的东八区时间一致。 查询mysql系统时区时间 show variables where variable_name"system_time_zone"; CST指的是中国标准时间&#xff0c;也是中国的标准时区。 set命令修改时区时间 global&#xf…

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

头歌-本关任务:使用GmSSL命令行,生成SM2私钥并对文件进行签名验证(第二关)。

第一关在网上找到了&#xff0c;但第二关没找到&#xff0c;在这里做一下补充:) 如果想认真学的话可以看看文档 国密SM2椭圆曲线密码标准http://gmssl.org/docs/sm2.html 内容为 GuetPython 的明文文件msg.txt 私钥sm2.pem 公钥sm2Pub.pem 使用sm2utl对msg.txt进行签名&…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

【C++初阶】第1课—初识c++

文章目录 1. 学习c之前的开胃菜2. c的发展历程3. c参考文档4. c的第一个程序5. 命名空间5.1 关键字namespace5.2 namespace的嵌套使用5.3 命名空间的使用 6. c输入和输出7. 缺省参数8. 函数重载9. 引用9.1 引用的使用9.2 const引用9.3 引用和指针的关系 10. nullptr11. inline修…

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…

Opengl光照测试

代码 #include "Model.h" #include "shader_m.h" #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" //以上是放在同目录的头文件#include <glad/glad.h> #include <GLFW/glfw3.…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…

js识别二维码

需要下载的js文件&#xff1a;https://download.csdn.net/download/impossible1994727/90001718https://download.csdn.net/download/impossible1994727/90001718 或者直接复制也行&#xff1a; var _aa {}; _aa._ab function (f, e) { var d qrcode.width; var b qrcode…

电子应用产品设计方案-11:全自动智能全屋智能系统设计方案

一、设计目标 打造便捷、舒适、安全且节能的全屋智能环境。 二、系统组成 1. 智能灯光系统 - 在客厅、卧室、厨房、卫生间等各处安装智能灯具&#xff0c;可通过手机 APP、语音控制实现开关、调光调色。如客厅设置多种场景模式&#xff0c;如“观影模式”&#xff08;灯光…

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…

【idea】更换快捷键

因为个人习惯问题需要把快捷键替换一下。我喜欢用CTRLD删除一下&#xff0c;用CTRLY复制一样。恰好这两个快捷键需要互换一下。 打开file——>setting——>Keymap——>Edit Actions 找到CTRLY并且把它删除 找到CTRLD 并且把它删除 鼠标右键添加CTRLY 同样操作在Delet…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…