基本算法——位运算

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]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity MiniCPM-V 让引擎拥有视觉

Unity MiniCPM-V 让引擎拥有视觉 前言项目Python环境布置Unity场景布置代码编写添加并设置脚本总结 鸣谢AI提示 前言 新发布的MiniCPM-V&#xff0c;忍不住玩一下&#xff0c;可以让之前制作的语音助手拥有一定的视觉能力&#xff08;不是OpenCV不行&#xff0c;而是AI更加符合…

项目中MySQL数据库设计(尚庭公寓)

数据库设计 1 数据库设计理论 1.1 数据库模型 数据库设计中最常采用的模型为实体&#xff08;Entity&#xff09;关系&#xff08;Relationship&#xff09;模型&#xff0c;简称ER模型。其核心思想是将现实世界中的复杂数据表示为一组实体&#xff0c;并描述这些实体之间的…

minos 2.5 中断虚拟化——vGIC

首发公号&#xff1a;Rand_cs 该项目来自乐敏大佬&#xff1a;https://github.com/minosproject/minos 这一节开始讲述真正的中断虚拟化&#xff0c;首先来看硬件方面的虚拟化。前文 minos 2.3 中断虚拟化——GICv2 管理 主要讲述 GICv2 的 Distributor 和 CPU Interface&…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:3D扫描仪 实时创建 VR 内容

虽然 VR 技术彻底改变了娱乐、医疗、建筑、教育和产品设计等各个日常生活领域&#xff0c;但创建 VR 内容仍然是一项不易突破的挑战。 英伟达在旧金山举行的 Jetson TX2发布会上&#xff0c;展示了Jetson TX2如何能够加快 AI 计算、图形和计算机视觉的运行速度&#xff0c;并且…

【一小时学会Charles抓包详细教程】Charles 抓包相关设置 (7)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 Charles 抓包相…

数据库学习总结

Mysql学习总结 汇总数据 聚集函数&#xff1a; 函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和 例&#xff1a; AVG函数&#xff1a; select avg(grade) from topic; COUNT函…

WiFi蓝牙模块促进传统零售数字化转型:智能零售体验再升级

随着科技的不断发展&#xff0c;数字化转型已经成为了各行各业的必然趋势。在传统零售业中&#xff0c;WiFi蓝牙模块的应用正逐渐推动着行业的数字化转型&#xff0c;为消费者带来更加智能化、便捷化的零售体验。本文MesoonRF美迅物联网将从以下几个方面阐述WiFi蓝牙模块在传统…

稍微学学react

文章开始前&#xff0c;先划划水~ 今日份开心&#xff1a; 今天看之前发布的按钮npm包下载量有162次&#xff0c;早知道好好做了 今日份不开心&#xff1a; 爬岗位看到一个整体都挺满意的岗位&#xff0c;公司位置和发展大方向都好喜欢&#xff01;&#xff01;&#xff01;…

机器学习学习(2)

基于数据流图的编程范式:声明式编程(Declarative Programming )、命令式编程(Imperative Programming ); 声明式编程(Declarative Programming ) 代表性框架:TensorFlow, CNTK, Caffe2 特点:用户只需要表达模型结构和需要执行的任务,无需关注底层的执行流程,框…

【UE+GIS】UE5GIS CAD或shp构建3D地形

贴合地形的矢量图形实现方法 一、灰度图的制作和拉伸换算1、基于高程点集实现2、基于等高线实现3、拉伸计算 二、生成地形模型的实现方案1、3Dmax导入灰度图2、使用ArcMap/Arcpro/FME等GIS数据处理工具3、UE导入灰度图 三、地形上叠加地形渲染效果的实现方案1、贴花2、数据渲染…

【transformers】pytorch基础

传送门&#xff1a;https://transformers.run/c2/2021-12-14-transformers-note-3/ pytorch基础知识 tensor &#xff1a; 张量。 需要知道的内容&#xff1a; 张量构建张量计算自动微分形状调整广播机制索引与切片升降维度 Tensor 张量&#xff1a;理解成高纬度的向量就完…

【最新鸿蒙应用开发】——什么是状态管理?

状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&#xf…

系统安全及其应用

系统安全&#xff1a; 1&#xff09;保护数据安全&#xff0c; 2&#xff09;互联网&#xff0c;网络业务服务等&#xff0c;必须要通过工信部的资质审核 3&#xff09;保护品牌形象 应用&#xff1a; 账号安全 1&#xff09;把不需要或者不想登录的用户设置为nologin us…

echarts绘制三维柱状图

echarts ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;主要用于数据的可视化展示。ECharts 支持丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、K线图等&#xff0c;可以满足不同类型数据的展示需求。 文档地址&#xff1a;echarts 本次所绘制三…

Django request.POST获取提交的表单数据

在Django中&#xff0c;request.POST 是一个特殊的属性&#xff0c;它是一个类似于字典的对象&#xff0c;用于访问通过POST方法提交的表单数据。如果你在视图中使用 print(request.POST.get(username))&#xff0c;这通常意味着你正在尝试从一个HTML表单中获取一个名为 userna…

数学建模之MATLAB入门教程(上)

前言&#xff1a; • MATLAB是美国Math Works公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 • MATLAB将数值分析、矩阵计算、科学数据可视化以及非线性动…

Ubuntu server 24 (Linux) 普通用户不能sudo 也不能使用root登录 忘记root密码 修复解决方案

一 普通用户无法sudo&#xff0c;同时也没有其他用户可用 #test用户使用sudo报错&#xff0c;没有权限 testtest:~$ sudo vi /etc/sudoers [sudo] password for test: test is not in the sudoers file. 二 关闭ubuntu 服务器&#xff0c;重新开机 按下ESC 键 1 出现GRUB…

【工具】探索 MOU:每用户通话时长

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 MOU…

RunLoop小白入门

核心概念 什么是 RunLoop ? RunLoop 是 iOS 和 macOS 应用程序框架中的一个核心概念&#xff0c;用于管理线程的事件处理。它可以看作是一个循环&#xff0c;用于持续接收和处理各种事件&#xff0c;如用户输入、定时器、网络事件等。RunLoop 在保持应用程序响应用户交互和系…

【再探】设计模式—备忘录模式与解释器模式

备忘录模式是用于保存对象在某个时刻的状态&#xff0c;来实现撤销操作。而解释器模式则是将文本按照定义的文法规则解析成对应的命令。 1 备忘录模式 需求&#xff1a;保存对象在某个时刻的状态&#xff0c;后面可以对该对象实行撤销操作。 1.1 备忘录模式介绍 提供一种状…