睡前一小时数学系列之从零开始的快速乘法。

当我们遇到大数相乘的时候情不自禁可以想到高精度。但是如果遇到 形如 a*b%c 的运算的时候。数也就是long long级别(2^61-1)但是没有办法的是这样数如果相乘会超long long级,再一模,hhhh肯定会炸。所以既然要提高乘法的效率而且保证精度。采用快速乘法。主要思想就是对数进行二进制拆分,运用乘法分配律把拆分结果加起来,嗯就好了。

举个栗子 23*123   123的二进制是(1111011)2 那么我们就可将这个结果拆成 23*2^0 +  23*2^1 +  23*2^3 + 23*2^4 + 23*2^5  + 23*2^6 。分开计算。每次将123右移一位还将23左移一位(同*2)。判断它二进制 第 t 位是不是1,能不能将23加入答案。

全程都可以用位运算来优化,这样速度又提升了一个次元。发一段快速乘法的程序。

long long  mul(long long x, long long y) {
    	long long  ret = 0;
	for(; y; y >>= 1) {
	    if((y & 1) && (ret += x) >= mod) ret -= mod;
	    if((x <<= 1) >= mod) x -= mod;
	}
	return ret;
}

观察这段代码可以发现,这里的取模运算是直接相减。这段代码已经交代的很完全了。

附加内容:

快速幂:

这个内容其实跟乘法很像 。因为这里乘法是对乘数进行拆分,而快速幂就是对幂进行拆分。

举个栗子: 23^123  123的二进制是(1111011)2 那么我们就可以将这个结果拆成23^2^0 +  23^2^1 +  23^2^3 + 23^2^4 + 23^2^5  + 23^2^6 . 那么我们每次就不是将23左移一位了。直接就进行乘方运算。而这里的乘方,也可以用到上面的快速乘法#手动滑稽。。这个又要比乘法又快了一步。

继续发一段这个的程序:

for(long long int i=x-y;i!=0;i>>=1 ,a=a*a)
	{
	     if(i&1)ans=a*ans;
	}

这两个东西的道理其实都很一样。但是这个原理在处理一些丧心病狂的数据的时候就是很快,可以拿(骗)到更多的分。

时间: 2024-11-04 12:21:16

睡前一小时数学系列之从零开始的快速乘法。的相关文章

睡前1小时数学系列之-整除

日常数学. 整除. 整除是数学里面最基础的概念.除法嘛.但是.这东西和平时义务教育讲的除法又有些不同. 定义:设a是一个非零的整数.b也是一个整数.如果存在一个整数p,使得 b=a*p:那么我们就称 b可以被a整除“整除”!.记作      a|b   . 所以b叫做a的倍数.a呢,叫做b的约数,也叫做因子. 举栗子.  3|12   21|63   5|15    就是这样. 整除.也有很多性质. 1,如果a|b &&  b|c  所以  a| c   有点传递性的味道. 栗子 :  5

睡前1小时数学之矩阵及其应用

1,矩阵 矩阵这个东西.顾名思义.就是由元素组成的矩形阵列.如图.这里的元素可能是符号啊,实数,式子什么的. 而这个矩阵的意义其实在于求解线性方程组.线性方程组中的未知数的量排成一个矩阵,加上常数项,就是增广矩阵. 还有什么表示线性转换,就不讲了.反正.也不会. 2,标记. 一般将一个矩阵中的m*n个元素,简称元,数a(ij)的位于矩阵A的第i行,第j列.这个数就被叫做这个矩阵A的(i,j)元.各种的记法就不说了.都是一个东西.明白元.就好.之后就是矩阵是怎么来的. 其实矩阵一开始是用来表示线性

睡前最养生的吃法

[导读]“睡前还吃东西?别开玩笑了吧?”很多人都会这样讲,但如果身体出现了一些问题,此时来点加餐还是不错的,有很好的缓解作用,专家对此深有体会,而且介绍了睡前最养生的吃法,下面一起来看看睡前最养生的吃法吧. 睡前最养生的吃法 止咳餐--杏仁磨成粉 吉林省健康协会常务理事郝孟忠:有咳嗽之疾的人大都经受过夜咳的痛苦,一到夜里两三点就格外厉害,自己受苦,家人也跟着睡不好.可在饭后少吃几瓣柚子,帮助去除肺热.而另外一种更有效的方法就是睡前喝杏仁茶,当天就能有所缓解. 方法如下:买些杏仁,回家后将杏仁打成

睡前数学一小时之线性筛素数:

睡前数学一小时之线性筛素数:1,朴素的筛素数算法:埃拉托斯特尼筛法.这是个简单再简单不过的一个素数的筛法.只是名字很拉风.这就告诉我们,往往东西不好这没什么,名字很拉风.别人也不会记住.hhhhh.这个的思路就是.每一个数都是由一个质数与和数(质数也可以)的积组成.这也是质数与和数的定义.而这个它这个筛发,就是当遇到一个质数的时候开始枚举,枚举[1,n]中间关于这个质数的倍数.每次都枚举,每次都将算出的这个数打上标记.而最后整个区间内的质数枚举完后,整个区间内的质数也就筛选出来了.这个很简单.时

数学系列:数学资源

中文数学专业网站:博士家园 http://www.math.org.cn http://www.bossh.net   数理逻辑.数学基础:http://www.disi.unige.it/aila/eindex.html 意大利逻辑及其应用协会的主页,包括意大利数理逻辑领域的相关内容.   http://www.plenum.com/title.cgi?2110 <代数与逻辑>,<西伯利亚代数与逻辑期刊>的翻译版,荷兰的Kluwer学术出版社提供其在线服务.   http://f

睡前吃药需注意三大风险

对不少“病号”而言,睡觉前除了洗漱,还有一件必须要做的事——吃药.药网提醒您,睡前吃的药有一定特殊性,也可能带来特定的风险. 需要在睡前服用的药物,多是为了利于起效,如安眠药能帮助睡眠:硫糖铝和铝碳酸镁也最好睡前服,因为此时胃部已排空,服药形成的保护膜不易被破坏:他汀类药物也推荐睡前吃,因为胆固醇的合成在午夜时最高.此外,睡前服扑尔敏等抗过敏药是为了避免嗜睡的副作用影响工作和生活.虽然这些药在睡前服能起到较好的效果,但有三大风险需要注意. 一是食道溃疡.多数药物都对黏膜有刺激性,如果药物附着在食

[ACM 1280]码农总共睡了多少小时?

Description 给你一个码农的上床时间和起床时间,计算他总共睡了多少小时? Input 有多组测试数据 每组一行,为上床时间和起床时间,中间一个空格隔开 Output 对于每组数据,输出码农总共睡觉的时间t(分钟) 当然 0<=t<24*60 Sample Input 01:00 08:00 23:00 08:00 Sample Output 420 540 #include<algorithm> #include<iostream> #include<s

朱亚东 临睡前发点鸡汤^^

临睡前发点鸡汤^^ 其实这么多鸡汤,还是这篇感觉最深刻,大牛的 很多真不好学.

long类型的时间转为n秒前n分钟前n小时前或者日期

1 package com.tai.use; 2 3 import java.text.DateFormat; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; 7 8 public class GuiYI 9 { 10 /** 11 * GuiYI 诡异的需求 12 * 转为 n秒前 n分钟前 n小时前 日期 13 * @param time 14 * @para