蓝桥杯:C++模运算、快速幂

模运算

模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,则可以对它取模,缩小数值再输出。取模可以防止溢出,这是常见的操作。

模是英文mod的音译,取模实际上是求余。

取模运算一般要求a和m的符号一致,即都为正数或都为负数。如果正负不同,那么请小心处理。

取模操作的加、减、乘满足分配律,注意此时仍要求a+b、a−b、a×b为正数,如果有负数,请小心处理。

例题1.刷题统计

2022年(第十三届)省赛,lanqiaoOJ题号2098

这题用暴力法很好解,但是只能拿到60的测试数据,差不多对一半吧。

暴力法代码:

#include <iostream>
using namespace std;
int main()
{// 请在此输入您的代码long long a,b,n;  //要用long long cin >> a >> b >> n;long long sum = 0,day = 0;  //定义做题数和天数while(sum < n){day++;if(day % 7 == 6 || day % 7 == 0) sum+=b;//周六周日else sum+=a;//周一到周五}cout << day;return 0;   //暴力法通过60,后面运行超时,这个是意料之中的。
}

放在取模题中,这也是一道取模的简单题,利用取模操作把计算复杂度降为O(1)。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{long long a,b,n;cin >> a >> b >> n;long long sum=5*a+2*b;//一周总数long long day=7*(n/sum);//总数除以一周总数乘以一周7天n=n%sum;//剩余题目long long d[]={a,a,a,a,a,b,b},i;//设立周数组for(i=0;n>0;i++)  {//当n=0时,就已经满足大于等于n,这个时候的天数就是答案n-=d[i];day++;}cout << day; return 0;
}

快速幂

int fastPow(int a, int n) {    //快速幂 int ans = 1;               //用ans返回结果,初始化为1,不能初始化为0while(n) {                 //把n看成二进制数,逐个处理它的最后一位if(n & 1)   ans *= a;  //如果n的最后一位是1,则表示这个地方需要参与计算a *= a;                //递推:a2 --> a4 --> a8--> a16-->…n >>= 1;               //n右移一位,把刚处理过的n的最后一位去掉}return ans;                //结果
}

例题1.快速幂

套模板即可,代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;                      //变量改用较大的long long型
ll fastPow(ll a, ll n, ll mod) {ll ans = 1;a %= mod;                             //非常重要,防止下面的ans*a越界while(n) {if(n & 1)   ans = (ans*a) % mod;   //取模a = a*a % mod;                     //取模n >>= 1;}return ans;       					   //输出结果 
}
int main() {ll b,p,k;cin>>b>>p>>k;cout << fastPow(b,p,k);return 0;
}

矩阵乘法

矩阵的加减法很简单,把两个矩阵对应位置的元素进行加减即可得到结果。

矩阵乘法:

for(int i=1; i<=m; i++)     //注:i、j、k的先后顺序不重要,因为对于c[][]来说都一样for(int j=1; j<=u; j++)for(int k=1; k<=n; k++)c[i][j] += a[i][k] * b[k][j]);

根据矩阵乘法的定义,可以推出下面两个式子。

例题1.矩阵相乘

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int n,m,k;
int A[N][N],B[N][N],C[N][N];
int multi(int  u, int v) {int sum = 0;for (int j=0; j<m; j++)  sum += (A[u][j] * B[j][v]);return sum;
}
int main() {cin >> n >> m >> k;for(int i=0; i<n; i++)for(int j=0; j<m; j++)    cin >> A[i][j];for(int i=0; i<m; i++)for(int j=0; j<k; j++)    cin >> B[i][j];for(int i=0; i<n; i++)for(int j=0; j<k; j++)    C[i][j] = multi(i, j);for(int i=0; i<n; i++) {for(int j=0; j<k; j++)    cout << C[i][j] << " ";cout << endl;}return 0;
}

GCD和LCM

最大公约数(Greatest Common Divisor,GCD)和最小公倍数(the Least Common Multiple,LCM)。

编程时可以不用自己写GCD代码,而是直接使用库函数。

C++的库函数__gcd()。

__gcd();   //shift  + -,输出_     注意是两个下划线,所以要操作两次shift+-

库函数__gcd()可能会返回负数,见下面的例子。

#include<bits/stdc++.h>
using namespace std;
int main() {cout<<__gcd(15, 81)<< endl;    //输出  3cout<<__gcd(0, 44)<< endl;     //输出  44cout<<__gcd(0, 0)<< endl;      //输出  0cout<<__gcd(-6, -15)<< endl;   //输出  -3cout<<__gcd(-17,289)<< endl;   //输出  -17cout<<__gcd(17,-289)<< endl;   //输出  17return 0;
}

LCM:

gcd(a, b)×lcm(a, b) = a×b,即lcm(a, b) = a×b/gcd(a, b) =a/gcd(a, b) ×b。

例题1.等差数列

解析:

代码: 

#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main() {int n;cin>>n;for(int i=0; i<n; i++)   cin>>a[i];sort(a,a+n);int d=0;for(int i=1; i<n; i++)   d = __gcd(d,a[i]-a[i-1]);    //以{2,5,7}为例if(d==0) cout<<n<<endl;    //公差为0,直接输出n就行else     printf("%d\n",(a[n - 1] - a[0]) / d + 1); return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的在线拍卖系统设计与实现(源码+调试+LW+PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的在线拍…

SQL Server —— While语句循环

一&#xff1a;简介 while 循环是有条件的循环控制语句。满足条件后&#xff0c;再执行循环体中的SQL语句。 while: break, 如果有多条语句可以在while后面添加begin-end。关于while的语法 while(条件) -- begin -- 语句1 -- 语句2 -- break 根据情况是否添加break -- end 二…

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

学习JAVA的第三天(基础)

目录 流程控制语句 顺序结构 分支结构 循环结构 分类&#xff1a; 练习 跳转控制语句 练习 数组 数组介绍 数组的定义和静态初始化 数组定义 数组的静态初始化 数组元素访问 数组遍历 数组动态初始化 JAVA内存分配 流程控制语句 顺序结构 是Java程序默认的执行流程…

8:00面试,8:05就出来了 ,问的实在是....

从外包出来&#xff0c;没想到竟然死在了另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以我也就忍了。没想到12月一纸通知&#xff0c;所有人都不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个…

基于SpringBoot的CSGO赛事管理系统源码和论文

CSGO赛事管理系统是针对CSGO赛事管理方面必不可少的一个部分。在CSGO赛事管理的整个过程中&#xff0c;CSGO赛事管理系统担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类的管理系统也在不断改进。本课题所设计的CSGO赛事管理系统&#xff0c;使用java进行开…

郑板桥的人生境界是难得糊涂

郑板桥是康熙秀才&#xff0c;雍正举人&#xff0c;乾隆进士。 郑板桥小时候跟父亲在真州读书&#xff0c;长大后在真州教书。后来&#xff0c;郑板桥去扬州卖画谋生。 郑板桥没有老师&#xff0c;画画靠自己琢磨。郑板桥一生画竹&#xff0c;画了四十年的竹子&#xff0c;主…

kubernetes之operator开发及informer机制源码分析

一、什么是operator&#xff1f; 在Kubernetes中我们经常使用 Deployment、DaemonSet、Service、ConfigMap 等资源&#xff0c;这些资源都是Kubernetes的内置资源&#xff0c;而对这些资源的创建、更新、删除的动作都会被称为事件(Event)&#xff0c;Kubernetes 的 Controller…

掌握这些测试开发技能,从容应对工作难题!

各位小伙伴, 大家好, 本期为大家分享一些测试开发工程师在企业中通过哪些测试开发技能解决难题。 一.如何定位缺陷 在企业中, 小伙伴们在发现bug后, 需要定位到具体产生bug的原因, 在这种情况下, 我们可以通过以下几种方案: 1.通过代理抓包来分析 常用的抓包工具有: Charle…

Modern C++ std::variant的5个特性+原理

1 前言 上一节《Modern C std::variant的实现原理》我们简单分析了std::variant的实现原理&#xff0c;其实要学好C编程&#xff0c;除了看优秀的代码包括标准库实现&#xff0c;读文档也是很便捷且必须的一种办法。 本节我将逐条解析文档中的五个特性&#xff0c;解析的办法有…

ChatGPT丨“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

时序预测demo 代码快速实现 MLP效果比LSTM 好,简单模拟数据

【PyTorch修炼】用pytorch写一个经常用来测试时序模型的简单常规套路&#xff08;LSTM多步迭代预测&#xff09; 层数的理解&#xff1a; LSTM&#xff08;长短期记忆&#xff09;的层数指的是在神经网络中堆叠的LSTM单元的数量。层数决定了网络能够学习的复杂性和深度。每一层…