基本算法——位运算

news2025/1/17 21:17:40

a^b

原题链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

运行代码

#include<iostream>
using namespace std;
long long a,b,c,t=1;
int main()
{
	cin>>a>>b>>c;
	for(;b;b/=2)
	{
		if(b&1)t=t*a%c;
		a=a*a%c;
	}
    cout<<t%c;
}

代码思路:快速幂取模算法

  1. 变量定义:首先定义了四个变量,a 代表底数,b 代表指数,c 代表模数,t 初始化为1,用于存储最终结果的中间值。

  2. 输入读取:通过 cin>>a>>b>>c; 读取用户输入的底数 a、指数 b 和模数 c

  3. 快速幂循环:通过一个 for 循环处理指数 b 的每一位。循环条件是 b 不为0,每次循环 b 都会右移一位(b/=2),相当于不断地将指数除以2并向下取整。

    • 判断奇偶性并累乘:在循环内部,首先使用条件 if(b&1) 判断 b 当前最低位是否为1,即判断 b 是否为奇数。如果是奇数,则需要将当前的 a 对结果 t 产生的影响累加进去,即执行 t=t*a%c;。这是因为当 b 是奇数时,a^b 实际上是 a 乘以 a 的其他偶数次幂结果,这里是通过累计 t 来逐步构建这个结果。

    • 平方并取模:无论 b 的当前最低位是0还是1,都会执行 a=a*a%c;,这意味着每轮循环都将底数 a 自身平方一次,并对结果取模 c,以控制数值大小,避免溢出。

  4. 输出结果:循环结束后,变量 t 存储了 a^b \mod c的计算结果,但为了确保结果的准确性(尽管理论上已经对每步进行了取模,但再次取模作为输出是良好的编程习惯),最终输出时执行 cout<<t%c;

Raising Modulo Numbers

原题链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

 

运行代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll in(){
    ll ans=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;c=getchar();
    }
    while(c>='0'&&c<='9'){
        ans=ans*10+c-'0';
        c=getchar();
    }
    return ans*f;
}
ll clac(ll a,ll b,ll M){
    ll ans=1;
    for(;b;b>>=1){
        if(b&1)ans=(ll)
            ans*a%M;a=a*a%M;}
    
    return ans;    
}
int main(){
    ll q=in();
    while(q--){
        ll ans=0;
        ll M=in(),n=in();
        for(int i=1;i<=n;i++){
            ll a=in(),b=in();
            ans=(ans+clac(a,b,M))%M;}
        cout<<ans<<endl;
    }
}

代码思路

自定义输入函数in():用于读取一个整数(可以是负数),通过逐字符读取并转换为数字,同时支持负数的输入。它首先初始化结果 ans 为0,符号标志 f 为1(表示正数)。如果读取到的是负号,f 设为-1。随后读取直到遇到非数字字符,再读取数字字符并累积到 ans 中,最后根据 f 返回实际的整数值(正数或负数)。

快速幂取模函数clac():输入参数为底数 a、指数 b 和模数 M。通过循环,每次将指数 b 右移一位(除以2),并根据 b 当前最低位是否为1(即 b 奇偶性)决定是否将 a 乘入结果 ans 中,并始终对 ansa 进行模 M 的运算,以避免数值过大。最后返回计算得到的 a^b%M。

主函数main():首先读取测试用例的数量 q,然后对于每个测试用例,读取模数 M 和需要执行幂运算的次数 n。接下来,进行 n 次循环,每次循环中读取底数 a 和指数 b,调用 clac() 函数计算 a^b \mod MabmodM 的结果,并将每次的结果累加到 ans 中,每次累加后都对 M 取模以确保结果正确。最后,输出所有累加结果对 M 取模后的值。

64位整数除法

原题链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

运行代码

#include <iostream>
using namespace std;
int main ()
{
    long long a,b,p,ans = 0;
    cin>>a>>b>>p;
    for (;b;b>>=1,a<<=1,a%=p)
        if (b&1)
            ans = (ans + a) % p;
    cout<<ans%p;
    return 0;
}

代码思路

这段C++代码是一个实现快速幂取模算法的程序,用于计算 a^b%p的值。快速幂算法是一种高效计算大整数幂取模的算法,特别适用于在计算机程序中处理大指数或大模数的情况,能够处理大整数情况,避免了直接计算的大规模乘法和溢出问题。

  1. long long a, b, p, ans = 0;:定义四个变量,a 和 b 分别表示底数和指数,p 表示模数,ans 初始化为0,用来存储最终的结果。cin >> a >> b >> p;:从标准输入读取三个数,分别赋值给变量abp
  2. for (;b;b>>=1,a<<=1,a%=p):这是一个循环结构,循环条件是b非零。在每次循环迭代开始时,将b右移一位(等价于除以2并向下取整),同时将a左移一位(等价于乘以2),并且对a取模p,确保a的值不会过大而导致溢出。
  3. if (b&1):判断b当前最低位是否为1(即判断b是否为奇数),这是快速幂算法的关键,仅当b为奇数时才直接累加a到结果中。
  4. ans = (ans + a) % p;:如果b是奇数,则将当前的a加上之前的累加结果ans,并对结果取模p,更新ans的值。
  5. cout << ans%p;:循环结束后,输出最终计算结果ans对模数p取模的结果。
  6. return 0;:主函数返回0,表示程序正常结束。

最短Hamilton路径

原题链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

运行代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20, M = 1 << N;
int n;
int g[N][N];
int dp[M][N];
int main() {
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> g[i][j];
    memset(dp, 0x3f, sizeof(dp));
    dp[1][0] = 0;
    for (int s = 1; s < (1 << n); s++) {
        for (int i = 0; i < n; i++) {
            if ((s & (1 << i)) == 0) continue;
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                if ((s & (1 << j)) == 0) continue;
                dp[s][i] = min(dp[s][i], dp[s ^ (1 << i)][j] + g[j][i]);
            }
        }
    }
    cout << dp[(1 << n) - 1][n - 1] << endl;
    return 0;
}

代码思路

  1. 定义常量和变量N 表示顶点数的上限,M 是状态数(所有顶点的选与不选的组合情况)。g[N][N] 存储图的边权。dp[M][N] 用于动态规划存储中间状态和结果。

  2. 输入图的信息。

  3. 初始化 dp 数组:将所有值初始化为较大值,除了初始状态 dp[1][0] 设置为 0。

  4. 动态规划过程:遍历所有可能的状态 s。对于每个状态和当前顶点 i,通过遍历其他顶点 j 来更新 dp[s][i],即考虑从之前某个状态去掉当前顶点 i 且到达顶点 j 的最短路径加上从 j 到 i 的边权,取最小值进行更新。

  5. 最后输出到达最终状态(所有顶点都选)且在终点 n-1 的最短路径长度,即 dp[(1 << n) - 1][n - 1]

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

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

相关文章

HTML5+CSS3+JS小实例:网格图库

实例:网格图库 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

俄罗斯ozon平台计算器,ozon定价计算器

在数字化飞速发展的今天&#xff0c;电商平台已成为商家们展示产品、吸引顾客的重要窗口。而在俄罗斯这一广阔的市场中&#xff0c;Ozon平台以其独特的优势&#xff0c;成为了众多电商卖家的首选。然而&#xff0c;想要在Ozon平台上脱颖而出&#xff0c;除了优质的产品和服务外…

C语言(结构体)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

基于数据帧进行SQL查询

本教程将通过一个具体的案例来演示如何在Spark SQL中基于数据帧进行SQL查询。我们将从创建临时视图开始&#xff0c;然后使用spark对象执行SQL查询&#xff0c;包括投影、选择、统计和排序等操作。 具体步骤如下&#xff1a; 基于数据帧创建临时视图&#xff1a; 命令格式&…

MySQL中所有常见知识点汇总

存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图&#xff1a; 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分&#xff1a; 连接器&#xff1a;负责跟客户端建立连 接、获取权限、维持和管理…

MFC 教程-文本框失去焦点处理

【1】增加窗口的消息处理函数 void CTESTMFCDlg::OnKillFocus(CWnd* pNewWnd) {//CDialogEx::OnKillFocus(pNewWnd);//首先使用true将数据从控件传入成员变量中UpdateData(true);//校验成员变量m_data中的数据是否符合要求&#xff0c;如果不符合&#xff0c;修改后将它显示在控…

windows10 安装子linux系统(WSL安装方式)

在 windows 10 平台采用了WSL安装方式安装linux子系统 1 查找自己想要安装的linux子系统 wsl --list --online 2 在线安装 个人用Debian比较多&#xff0c;这里选择Debian&#xff0c;如下图&#xff1a; wsl --install -d Debian 安装完成&#xff0c;如下&#xff1a; 相关…

【kubernetes】探索k8s集群的pod控制器详解(Deployment、StatefulSet、DaemonSet、Job、CronJob)

目录 一、Pod控制器及其功用 二、pod控制器有多种类型 2.1ReplicaSet 2.1.1ReplicaSet主要三个组件组成 2.2Deployment 2.3DaemonSet 2.4StatefulSet 2.5Job 2.6Cronjob 三、Pod与控制器之间的关系 3.1Deployment 3.2SatefulSet 3.2.1StatefulSet三个组件 3.2.2为…

人事管理系统有哪些优势?5大人事管理系统大盘点!

本人研究企业数字化转型10余年&#xff0c;为企业软件选型、数字化提供咨询服务&#xff01;目前重点研究低代码数字化转型玩法&#xff0c;力争为各家企业探索出一条更具性价比的数字化方式。 人事管理系统有哪些优势&#xff1f;如何选择&#xff1f;又该怎样部署&#xff1…

从分布式训练到大模型训练

要了解大模型训练难&#xff0c;我们得先看看从传统的分布式训练&#xff0c;到大模型的出现&#xff0c;需要大规模分布式训练的原因。接着第二点去了解下大规模训练的挑战。 从分布式训练到大规模训练 常见的训练方式是单机单卡&#xff0c;也就是一台服务器配置1块AI芯片&a…

分享一个 ASP.NET WebForm 使用 Form Authentication 的例子

前言 前些天一个朋友说他们客户的网站出了点故障&#xff0c;让我帮忙看看&#xff0c;这个网站还是用 ASP.NET WebForm 做的&#xff0c;很久以前的技术了&#xff0c;不过很多客户就是这样&#xff0c;只要网站还能稳定地运行&#xff0c;一般就不会去折腾升级&#xff0c;_…

搭建基于Django的博客系统增加广告轮播图(三)

上一篇&#xff1a;ChatGPT搭建博客Django的web网页添加用户系统&#xff08;二&#xff09; 下一篇&#xff1a;搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL&#xff08;四&#xff09; 功能概述 增加轮播图显示广告信息。 需求详细描述 1. 增加轮播图显示广告信…

Vue04-模版语法

一、插值语法 作用&#xff1a;将指定的值放在指定的位置。 二、指令语法 效果&#xff1a; 将href中的跳转地址&#xff0c;交给Vue实例管理&#xff1a; Vue的指令&#xff0c;以v-xxxx开头&#xff0c;以表示它们是 Vue 提供的特殊 attribute。 2-1、v-bind命令 可以给标签…

C盘清理攻略!!!详细步骤

c盘爆满怎么清&#xff0c;往下看 一、清缓存文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;%temp% 二、清理安装包文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;softwaredistribution 三、清理软件解压临时文件键盘winr打开运行窗口&#xff0c;输入&#xf…

使用matplotlib绘制折线条形复合图

使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中&#xff0c;复合图形是一种非常有用的工具&#xff0c;可以同时显示多种数据类型的关系。在本篇博客中&#xff0c;我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 imp…

[数据集][目标检测]脑肿瘤检测数据集VOC+YOLO格式9787张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9787 标注数量(xml文件个数)&#xff1a;9787 标注数量(txt文件个数)&#xff1a;9787 标注…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是&#xff0c;代理服务器也有不同的类型。就其来源而言&#xff0c;最常见的代理服务器类型是住宅代理和数据中心代理&#xff1a; 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址&#xff0c;因此允许…

LeetCode-165. 比较版本号【双指针 字符串】

LeetCode-165. 比较版本号【双指针 字符串】 题目描述&#xff1a;解题思路一&#xff1a;字符串分割解题思路二&#xff1a;双指针背诵版&#xff1a; 题目描述&#xff1a; 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 ‘.’ 分开的…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…

灯塔歌曲音乐下载官网

灯塔歌曲音乐下载官网网址&#xff1a;www.dengtamp3.com 灯塔音乐下载上线以“用心服务&#xff0c;认真负责”为核心价值。 我们的团队是一个青春的团队&#xff0c;朝气蓬勃。我们采用最新的服务模式&#xff0c;以网为媒为广大客户提供服务&#xff0c;我们坚持以“用心&a…