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

这篇具有很好参考价值的文章主要介绍了蓝桥杯:C++模运算、快速幂。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模运算

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

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

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

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

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

例题1.刷题统计

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

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

这题用暴力法很好解,但是只能拿到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;
}

快速幂

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

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

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

例题1.快速幂

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

套模板即可,代码:

#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;
}

矩阵乘法

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

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

矩阵乘法:

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

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]);

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

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

例题1.矩阵相乘

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

代码:

#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;    //输出  3
	cout<<__gcd(0, 44)<< endl;     //输出  44
	cout<<__gcd(0, 0)<< endl;      //输出  0
	cout<<__gcd(-6, -15)<< endl;   //输出  -3
	cout<<__gcd(-17,289)<< endl;   //输出  -17
	cout<<__gcd(17,-289)<< endl;   //输出  17
	return 0;
}

LCM:

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

例题1.等差数列

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

解析:

蓝桥杯:C++模运算、快速幂,蓝桥杯c++,蓝桥杯,c++,数据结构,算法,c语言,开发语言

代码: 文章来源地址https://www.toymoban.com/news/detail-826174.html

#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;
}

到了这里,关于蓝桥杯:C++模运算、快速幂的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】:实现顺序表各种基本运算的算法

    领会顺序表存储结构和掌握顺序表中各种基本运算算法设计。 编写一个程序sqlist.cpp,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序,完成如下功能: 初始化顺序表L 依次插入a,b,c,d,e元素 输出顺序表L 输出顺

    2024年02月07日
    浏览(46)
  • 蓝桥杯:C++模运算、快速幂

    模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,则可以对它取模,缩小数值再输出。取模可以防止溢出,这是常见的操作。 模是英文mod的音译,取模实际上是求余。 取模运算一般要求a和m的符号一致,即都为正数或都为负数。如果正

    2024年02月19日
    浏览(33)
  • C语言数据结构篇——用栈实现四则运算

    作者名:Demo不是emo  主页面链接: 主页传送门 创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: 网络安全,数据结构 每日emo: 我爱

    2024年02月09日
    浏览(54)
  • 数据结构(严蔚敏)【一元多项式的运算】【C语言】

    1、一元多项式的运算:实现两个多项式加、减乘运算 设计内容: 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为:用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法; 设计思路: 将顺序表数组下标作为多项式的指数项,数组内的数据元素

    2023年04月15日
    浏览(47)
  • 数据结构基础篇》》用c语言实现复数的八个基本运算

    数据结构开讲啦!!!🎈🎈🎈 本专栏包括: 抽象数据类型 线性表及其应用 栈和队列及其应用 串及其应用 数组和广义表 树、图及其应用 存储管理、查找和排序 将从简单的抽象数据类型出发,深入浅出地讲解复数,海龟作图 到第二讲线性表及其应用中会讲解,运动会分数

    2024年02月07日
    浏览(47)
  • C语言如何使用枚举类型和位运算来处理复杂的数据结构?

    首先,让我们谈谈枚举类型。假设你是一名班级的学生,而你的班级有很多人。有时我们希望用数字来代表每个学生的年龄,但是对于阅读代码来说,数字很难理解。这就是枚举类型的用武之地! 我们可以用枚举类型来定义一些有意义的名字,这些名字代表我们想要表示的概

    2024年02月12日
    浏览(52)
  • 【C++】数据结构:抽象定义复数,并实现复数的加、减、乘、除四则运算

    大一生在线学习数据结构,哭唧唧! 步入正题,数据结构的第一个程序就是抽象定义复数,因为我没有学过类和对象,所以只能用最简单的结构体来定义复数。 先来回顾一遍书上知识点 1.复数的抽象定义 2.表示部分 3.实现部分  谢谢是个懒人,直接搬书。 我将数据结构中算

    2024年02月06日
    浏览(47)
  • 数据结构与算法:快速排序

    荷兰国旗问题 想要理解快速排序,就先理解这个问题: [LeetCode75.颜色分类] 荷兰国旗是由红白蓝三色组成的: 现在将其颜色打乱 然后根据一定的算法,将其复原为红白蓝三色,这就叫做荷兰国旗问题。 在LeetCode的题目中,其将荷兰国旗的三个颜色用0,1,2来表达,也就是说

    2024年01月15日
    浏览(43)
  • 【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

       Qestion:   完成用十字链表存储的稀疏矩阵的加法运算。 获取两个稀疏矩阵总有多少个非零元素,记作 cnt 。 当 cnt 不为零时一直循环,每循环一次 i++ ,也就是行循环,每循环一次就转移至下一行。 先从第一行开始循环,使得两个工作指针 p 、 q 分别指向两个稀疏矩阵

    2024年02月13日
    浏览(45)
  • 数据结构——排序算法之快速排序

        个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想: 任取待排序元素序列中 的某元素作为基准值,按照

    2024年01月21日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包