【例题】64位整数乘法

题目地址

  • 方法一 (口胡一下就好了啊)

快速幂思想的灵活运用。

把 \(b\) 用二进制表示 , 设 \(b\) 在二进制下有 \(k\) 位 , \(c_i\) 表示 \(b\) 在二进制下的第 \(i\) 位

\[b=c_{k-1}*2^{k-1}+c_{k-2}*2^{k-2}+...+c_{0}*2^{0}\]

根据加法原理,\(a*b\) 相当于 \(b\) 个 \(a\) 相加,现在把 \(b\) 用二进制表示,那么就有:

\[a*b=c_{k-1}*2^{k-1}*a+c_{k-2}*2^{k-2}*a...+c_0*2^0*a\]

根据模运算的规则,边运算边取模。

再打上类似快速幂的板子,就可以分分钟切掉这题了。这里不放代码,因为我没写。

  • 方法二 (玄学方法)

我们知道:

\[a*b \text{ mod } p = a*b-[\frac{a*b}{p}]*p\]

注:[ ]暂且看做向下取整

然后书中用了 long double 胡搞一下就过了。反正我是没看懂。

有兴趣的朋友可以写一下。

咱也不知道,咱也不敢问,咱也不想问。

原文地址:https://www.cnblogs.com/BaseAI/p/11406465.html

时间: 2024-10-13 10:33:45

【例题】64位整数乘法的相关文章

[位运算] 64位整数乘法(mod 一个数)

64位整数乘法 在部分题目中可能涉及到长整数(long long)的相关计算,可当我们需要将两个长整数相乘时有可能出现溢出的情况,这时候通常需要进行高精度计算,可如果我们需要将两个长整数相乘并 mod 一个数时高精度计算也就不太方便了,这时我们需要一个优秀的算法让我们快速的计算出类似 a×b mod c 的数值 [算法描述(1)] 我们用快速幂的思想,将b用二进制表示 b=ck-12k-1+ck-22k-2+-+c020 那么: a×b=a×(ck-12k-1+ck-22k-2+-+c020)=

ACwing90 64位整数乘法 大数乘法取模

网址:https://www.acwing.com/problem/content/92/ 题解: 大数乘法取模模板. AC代码: #include <bits/stdc++.h> using namespace std; long long add(long long a, long long b, long long p) { long long res = 0; while (b) { if (b & 1) res = (res + a) % p; a = (a * 2) % p

64位整数乘法

a * b mod p可以转换为 (a+a+a+a+.......+a) mod p 即为处理 a 2a 4a 8a .......... #include<iostream> using namespace std; int main(){ long long a,b,p; cin>>a>>b>>p; long long ans = 0; a%=p; while(b){ if(b&1) ans = (ans+a)%p; a = a * 2 % p;

90. 64位整数乘法

#include <iostream> using namespace std; int main() { long long a, b, p; cin >> a >> b >> p; long long res = 0; while(b) { if(b & 1) res = (res + a) % p; a = (a + a) % p; b >>= 1; } cout << res << endl; return

第三次作业 阅读程序有符号 64 位整数数据类型

这是一个C++程序,,,额,看着头痛(额,说实话,由于中间有一年多没上过学,再加上最开始也学的很一般,读起来累)不过什么东西慢慢来总能越来越好 问题一: 答: 首先Int64 i 是表示有符号 64 位整数数据类型,这个数i范围很大 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )....我表示大学这么几年,程序里面遇见这种情况的次数少 由此可见学校的东西和实际毕竟还是差距很大 然后看for循环 fo

16位整数,32位整数,64位整数

首先解释16位整数:所谓16位整数就是16个二进制位(16#7FFF)而对应的最大整数为32767:PLC中是用二进制的补码来表示有符号数的,定义最高位为符号位:当最高位位0时为正:最高位为1时为负;所以经过换算就是-701:(补码是正数先求反码(0变1:1变0)然后加1): 以次内推,32位,64位也是如此.

windows 64位整数

#include <iostream> #include <ctime> using namespace std; int main() { cout << sizeof(long) << endl;//4 cout << sizeof(long long) << endl;//8 cout << sizeof(__int64) << endl;//8 //time_t在64位上为__time64_t,为__i

64位BASM学习随笔(一)

?? Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,因为C/C++的内联汇编只能是或插入式的汇编代码,函数花括号背后隐藏的函数框架,限制了汇编代码的发挥,如无论有无参数和局部变量,总是有个栈框架,更烦人的是只要你在函数中使用了esi,edi,ebx寄存器,就自动给你保存和恢复,使得这些寄存器没法在函数之间传递信息等:而Delphi的BASM可以是插入式的汇编代码,也可是完全的汇编方法,在完全的汇编方法下,怎么发挥就是自己的事了.    De

asp.net C# int 类型在32/64位环境下取值范围无变化

最近在学习中突然想到,我在64位环境下,int取值范围是否有变化?为了检测这个结果,我做了以下这个测试:1.环境:win7旗舰版64位+vs2010 sp1(版本号:10.0.40219.1SP1Rel)+.Net 4.0.30319 SP1Rel2.代码: 代码如下 复制代码 using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplicatio