AcWing90. 64位整数乘法

这篇具有很好参考价值的文章主要介绍了AcWing90. 64位整数乘法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

a a a b b b p p p 取模的值。

输入格式

第一行输入整数 a a a,第二行输入整数 b b b,第三行输入整数 p p p

输出格式

输出一个整数,表示 a*b mod p 的值。

数据范围

1 ≤ a , b , p ≤ 1 0 18 1≤a,b,p≤10^{18} 1a,b,p1018

输入样例

3
4
5

输出样例

2

思路

C++ 内置的最高整数类型是 64 位,现在 a ∗ b a * b ab mod p p p 中的三个变量 a , b , p a, b, p a,b,p 都在 1 0 18 10^{18} 1018 级别,则不存在一个可供强制转换的 128 位整数类型,需要一些特殊的处理办法。

类似快速幂的思想,把整数 b b b 用二进制表示,即 b = c k − 1 2 k − 1 + c k − 2 2 k − 2 + . . . + c 0 2 0 b = c_{k-1}2^{k-1} + c_{k-2}2^{k-2} + ... + c_02^0 b=ck12k1+ck22k2+...+c020,则 a ∗ b = c k − 1 ∗ a ∗ 2 k − 1 + c k − 2 ∗ a ∗ 2 k − 2 + . . . + c 0 ∗ a ∗ 2 0 a * b = c_{k-1} * a * 2^{k-1} + c_{k-2} * a * 2^{k-2} + ... + c_{0} * a * 2^{0} ab=ck1a2k1+ck2a2k2+...+c0a20

因为 a ∗ 2 i = ( a ∗ 2 i − 1 ) ∗ 2 a * 2^{i} = (a * 2 ^{i-1}) * 2 a2i=(a2i1)2,若已求出 a ∗ 2 i − 1 a * 2^{i-1} a2i1 mod p p p,则计算 ( a ∗ 2 i − 1 ) ∗ 2 (a * 2 ^{i-1}) *2 (a2i1)2 mod p p p 时,运算过程中每一步的结果都不超过 2 ∗ 1 0 18 2 * 10^{18} 21018,仍然在 64 位整数 long long 的表示范围内,所以很容易通过 k k k 次递推求出每个乘积项。当 c i = 1 c_i = 1 ci=1 时,把该乘积项累加到答案中即可。

时间复杂度为 O ( l o g 2 b ) O(log_2b) O(log2b)文章来源地址https://www.toymoban.com/news/detail-716423.html

代码

#include <cstdio>

using namespace std;

typedef long long ll;

ll mul(ll a, ll b, ll p) {
    
    ll ans = 0;
    
    while (b) {
        if (b & 1) ans = (ans + a) % p;
        b >>= 1;
        a = a * 2 % p;
    }
    
    return ans;
}

int main() {
    ll a, b, p;
    scanf("%lld%ld%lld", &a, &b, &p);
    printf("%lld\n", mul(a, b, p));
    return 0;
}

到了这里,关于AcWing90. 64位整数乘法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】

    目录 一、99乘法表 汇编代码 效果 二、整数拆分 问题描述 c代码 汇编代码 效果 三、素数环 问题描述 c代码 效果 四、迷宫问题 问题描述 c代码 汇编代码 效果 汇编代码 效果 貌似有点问题,忘了把运算结果加上...... 问题描述 问题描述 输入一个N,输出所有拆分的方式。 如

    2023年04月09日
    浏览(28)
  • FPGA 移位运算与乘法

             已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)           复位信号高有效,低复位;在inpu_grant上升沿到来时,取一次d的值,并且4个时钟周期取一次;out是将inpu_grant取

    2024年01月16日
    浏览(23)
  • 大数运算(加法,减法,乘法,除法)

    目录 一.大数加法 1.题目描述 2.问题分析 3.代码实现 二.大数减法 1.题目描述 2.问题分析 3.代码实现 三.大数乘法 1.题目描述 2.问题分析 3.代码实现 四.大数除法 1.题目描述 2.问题分析 3.代码实现 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

    2024年02月07日
    浏览(36)
  • 矩阵乘法实现卷积运算

            矩阵根据卷积核的大小进行,从左到右、从上到i 下 的移动,对应数据相乘再相加得到的数据为该区域的值。 ​​​​​​​ ​​​​​​​         原理:根据对于相乘相加的机制,发现通过对卷积核填零构成和输入矩阵大小一致的矩阵,然后展平拼接起来,

    2024年02月12日
    浏览(35)
  • Verilog|有无符号加法与乘法运算

    一、无符号: 直接运算 二、有符号与无符号: 强制当作无符号运算 如c=a+b,a、b四位,c五位,计算时Verilog会将a和b扩展到五位再做加法,如果ab中有无符号数,则展宽会按照无符号数来,就是高位补0,因此有符号数结果将不正确。 解决:$signed(),c=a+$signed(b),扩展会按照有符

    2024年02月14日
    浏览(31)
  • 「Verilog学习笔记」移位运算与乘法

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网   分析  1、在硬件中进行乘除法运算是比较消耗资源的一种方法,想要在不影响延迟并尽量减少资源消耗,必须从硬件的特点上进行设计。根据寄存器的原理,由于是二进制,所以

    2024年02月05日
    浏览(31)
  • [C++/PTA] 矩阵的乘法运算

    线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。 建立一个整数矩阵类matrix,其私有数据成员如下: 建立该整数矩阵类matrix构造函数; 建立一个 *(乘号)的运算符重载,

    2024年02月04日
    浏览(25)
  • MATLAB数值计算——矩阵运算乘法、除法、乘方

    矩阵是线性代数的基本单元 矩阵含有M行N列数值 矩阵中的元素可以是实数或复数 矩阵相关的基本运算:加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 运算符: 注:矩阵的乘法运算中没有乘法交换律 运算符: * 注: x=B/A是方程x A=B的解。即x=A的逆

    2024年01月16日
    浏览(33)
  • 在simulink中进行矩阵的乘法运算

    双击 product 选择为 Matirx 要使用 Reshape 将矩阵排列成矩阵模式 Matlab 的是按列读取向量,按列放置向量 1*4 向量或者 4*1 向量,MATLAB 都只认为是 4 维向量,而不是分别的行向量或者列向量 使用矩阵乘法,必须 reshape 重塑矩阵维度

    2024年02月11日
    浏览(35)
  • 5.7 汇编语言:汇编高效乘法运算

    乘法指令是一种在CPU中实现的基本算术操作,用于计算两个数的乘积。在汇编语言中,乘法指令通常是通过 mul(无符号乘法) 和 imul(有符号乘法) 这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多,所以编译器在优化代码时通常会尝试将乘法操作转换为更

    2024年02月11日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包