牛客网 64位整数乘法

题目描述

求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤1018
输入描述:
第一行a,第二行b,第三行p。
输出描述:
一个整数,表示a×b mod p的值。
示例1
输入
2
3
9
输出
6
题目链接:https://ac.nowcoder.com/acm/contest/996/C
来源:牛客网

解析

很显然,直接返回a*b%p势必会出现乘法溢出的情况!借鉴快速幂的思想,可以得到如下解决方案:
1.将a*b改为b个a相加,不断对a做"a=a+a"的迭代,可依据b选择对应的迭代值a加入到累加值res中,使得res恰好为初始a值的b倍。
2.由于模运算存在这样一个性质:(a+b)%p=(a%p+b%p)%p。同样可以推广到(a+b+c+…)%p=(a%p+b%p+c%p+…)%p。用文字表述就是任意多个加数相加后再取模等于各加数取模后相加再取模。故只需要每一步都对加数(a+a)取模,每一步都对“各加数取模后相加”得到的(res+a)取模。如此就防止了乘法的溢出,同时快速幂的思想也保证了较低的时间复杂度。
附上之前写的快速幂详解!(通俗易懂),以做对比学习。

AC代码

#include<iostream>
using namespace std;
typedef long long LL;
 LL multi(LL a,LL b,LL p){    
 LL res=0;
 while(b>0){
 if(b&1) res=(res+a)%p;  / /对“各加数取模后相加”得到的(res+a)取模
 a=(a+a)%p;             / /对加数(a+a)取模
 b=b>>1;
 }    
 return res;    
 }
int main(){     
LL a,b,p; 
cin>>a>>b>>p;   
cout<<multi(a,b,p);    
  return 0;  
}

上一篇博客:快速幂详解(通俗易懂!)

### 牛客网华为机试算法题目解析 #### 题目一:矩阵链相乘优化 在处理矩阵链相乘问题时,可以通过动态规划来减少不必要的计算量。例如,在给定三个矩阵 A(10×30), B(30×5), 和 C(5×60),可以按照两种方式计算 (AB)C 或者 A(BC)[^1]。前者的计算复杂度为 \(10 \times 30 \times 5 + 10 \times 5 \times 60 = 4500\) 次乘法操作;而后者则需要 \(30 \times 5 \times 60 + 10 \times 30 \times 60 = 27000\) 次乘法操作。因此选择合适的括号置能够显著降低运算成本。 #### 题目二:统计字符串中的特定字符数量 对于统计某个子串在母串中出现次数的问题,可以直接利用 Python 的内置 `count` 方法完成此任务。下面是一个简单的实现例子: ```python str1 = input() str2 = input() print(str1.lower().count(str2.lower())) ``` 上述代码片段展示了如何忽略大小写差异并计数指定字符或子串在整个输入字符串内的存在频率[^2]。 #### 题目三:十六进制转十进制整型数值 当涉及到不同基数之间的转换时,标准库提供了便捷的方法来进行此类变换。比如使用 C++ 中的 `std::stoi` 函数可以从字符串形式读取数据,并将其解释成相应类型的值。这里提供了一个基于该技术的小程序用于演示目的: ```cpp #include <iostream> using namespace std; int main(){ string str; cin >> str; cout << stoi(str, nullptr, 16) << endl; } ``` 这段源码实现了从用户那里接收一个表示十六进制数字的字符串作为输入参数,接着输出对应的十进制表现形式的结果[^3]。 #### 题目四:二十四点游戏逻辑设计 最后考虑这样一个经典益智类小游戏——即所谓的“二十四点”。它的基本规则是从一副扑克牌里随机抽取四张卡片(假设它们上面标记有介于1到9之间任意正整数),玩家尝试运用加减乘除四种基础算术运算符以及必要的圆括号改变优先级关系使得最终表达式的求值得恰好等于24即可获胜[^4]。 以下是解决这个问题的一种可能策略框架: - 枚举所有可能的操作序列; - 对每种情况应用递归回溯搜索找到满足条件的一组解决方案之一。 虽然具体编码细节超出了当前讨论范围之外,但是理解这些概念有助于构建实际应用程序版本的基础架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值