青少年编程知识记录 codecoming

【数论】快速乘

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘。快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利用了一个bug才实现的功能。这个bug 就是 long double 和long long 的定义范围不同。因为long double的范围比long long 大一些。它来源于下面这篇文章:什么意思呢?简单来说,就是就是在原地爆炸的边缘疯狂试探,把本来存进long long会炸掉的值先进行计算,用
作者:亿万年的星光 分类:C++知识 浏览:

【数论】龟速乘

我们前面一篇文章学习了快速幂。它可以解决两类问题:a^b,(a^b)%c对于第一类,我们可以使用递归法或者迭代法可以求出,为了计算的快,我们可以引入位运算操作,但是目前来看,无论怎么优化都不能超过long long。对于第二类,是快速幂的优点所在,通过 (a*b)%m=(a%m * b%m) %m公式,我们可以将结果运算范围大大减小,使运算结果保持在m范围以内。但是,快速幂并不是万能的,比如下面这个例子求(a^b)%m。19260817 2333333 12345676543
作者:亿万年的星光 分类:C++知识 浏览:

【数论】杨辉三角

一、起源 杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。可以看出,它与上节课讲的二项式系数一样。二、特点每个数等于它上方两数之和。每行数字左右对称,由1开始逐渐变大。第n行的数字有n项。前n行共[(1+n)n]/2 个数。
作者:亿万年的星光 分类:C++知识 浏览:

【数论】二项式定理

一、基本概念

上面这个式子就叫做二项式定理,又称牛顿二项式定理,该定理给出两个数之和的整数次幂诸如展开为类似项之和的恒等式。二项式定理可以推广到任意实数次幂,即广义二项式定理。

 初中高中阶段比较常用的是二次方和三次方

(a+b)²=a²+2ab+b²

(a+b)³=a³+3a²b+3ab²+b²



扩展:常见平方和立方和公式及其变形:

(a+b)²=a²+2ab+b²

(a-b)²=a²-2ab+b²

a²-b²=(a+b)(a-b)

(a+b)³=a³+3a²b+3ab²+b²

(a-b)³=a³-3a²b+3ab²-b³

a³+b³=(a+b)(a²-ab+b²)

a³-b³=(a-b)(a²+ab+b²)

作者:亿万年的星光 分类:C++知识 浏览:

【数论】均值不等式

均值不等式是高中常见的一个知识点,下面这篇文章做一下简单总结。

1、

其中a,b属于实数R,当且仅当a=b时,等号成立。这个也叫基本不等式



2、

其中a,b属于正实数,当且仅当a=b时,等号成立。





3、

其中a,b属于正实数,当且仅当a=b时,等号成立。



4、



其中a,b属于正实数,当且仅当a=b时,等号成立。

5、不等式链

6、注意使用不等式求最值的条件是:一正、二定、三相等



7、例题一



若实数满足a+b=2, 则3^a+ 3^b 的最小值是____________





作者:亿万年的星光 分类:C++知识 浏览:

【题解】切比雪夫距离

【题目描述】

小C有一个平面!它发现了平面上的两个点,请你求出求它们之间的切比雪夫距离。切比雪夫距离定义为x与y方向坐标差的绝对值较大值。

【输入描述】

四个整数,a,b,c,d。坐标为(a,b)与(c,d)

【输出描述】

输出这两个点的切比雪夫距离。

【样例输入】

0 0 3 4

【样例输出】

4

【数据范围】

0<=a,b,c,d<=100
作者:亿万年的星光 分类:题解目录 浏览:

【数论】常见的距离度量方法

一、欧式距离欧式距离(Eucliden Metric,也是欧几里得度量)是一个通常采用的距离定义,旨在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。例如:对于二维平面上的两点p(x1,y1)与p(x2,y2)间的欧式距离公式为:同理,对于三维平面上两点p(x1,y1,z1)与p(x2,y2,z2)间的欧式距离公式为:欧式距离是距离算法中最常用的方式,日常生活中的大部分距离都可以通过欧式距离进行计算。二、余弦相似度余弦相
作者:亿万年的星光 分类:C++知识 浏览:

【数论】组合数学—容斥原理

  1. 概念

计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理

     2.举例

(1)如果被计数的事物有A,B两类,那么,A类和B类元素个数总和=A类元素个数+B类元素个数-即使A类又是B类元素个数。

那么公式就是:

             |A∪B|  = |A| + |B| - |A∩B| 

可以用下面的图表示(也叫韦恩图):



U表示全集(整个集合),A表示符合A类的数量,B表示符合B类的数量,I表示既不符合A也不符合B的数量,AB表示既符合A也符合B的数量,则U-I=A+B-AB。

(2)如果被计数的事物有A、B、C三类,那么,A类和B类和C类元素个数总和= A类元素个数+ B类元素个数+C类元素个数-既是A类又是B类的元素个数-既是A类又是C类的元素个数-既是B类又是C类的元素个数+既是A类又是B类而且是C类的元素个数。

            |A∪B∪C|  = |A| + |B| + |C|  - |A∩B| -  |B∩C| - | C∩A | + |A∩B∩C|

可以用下面的图表示:



U表示整个大集合,A表示符合A类的数量,B表示符合B类的数量,C表示符合C类的数量,I表示既不符合A也不符合B还不符合C的数量,AB表示既符合A也符合B的数量,BC表是同时符合B和C的数量,AC表示既符合A也符合C的数量,ABC表示同时符合A、B、C的数量。

根据容斥原理的定义,先不考虑重叠,把某内容的所有对象数目先计算出来(即A+B+C);再剔除重复计算的数目,AB这部分被计算了两次,也就是重复了一次,要剪掉,同理BC,AC也要个减掉一次;

那ABC呢?在A+B+C中我们把ABC统计了三次,所以理论上需要减掉两次,但是ABC同时又在AB、AC、BC中,也就是说我们减去AB的时候已经减了一次ABC,减去BC的时候又减了一次ABC,减AC的时候再一次减掉了ABC,即ABC总共减了三次。所以就需要额外再加回来一次。

那么等量关系就变成了U-I=A+B+C-AB-AC-BC+ABC

    3.例题

(1)为了发展体育运动,学校这学期开了体育兴趣课,学生需要从篮球和足球中选,允许两个同时选或同时不选。一个班级有50人,选了篮球的有32人,选了足球的有21人,两种都选了的有17人。问:有多少同学两种都没选。

    

如上图所示,篮球32人和足球21人,用总数50减去篮球再减去足球,中间重叠的部分被减了两次,所以再加一个中间重叠部分。50-32-21+17=14人。





(2)某校六⑴班有学生55人,每人在暑假里都参加体育训练队,其中参加足球队的有22人,参加排球队的有23人,参加游泳队的有24人,足球、排球都参加的有11人,足球、游泳都参加的有10人,排球、游泳都参加的有9人,问:三项都参加的有多少人?

我们假设足球队是A,排球队是B,游泳队是C。那么根据公式  |A∪B∪C|  = |A| + |B| + |C|  - |A∩B| -  |B∩C| - | C∩A | + |A∩B∩C| 可以得出。

    55 = 22+23+24-11-10-9 +  |A∩B∩C| 。该式子计算得:16



(3) 
  假设班里有50名学生,每个人都必须选修一门运动科目,选修篮球的有15人,选修足球的有20人,选修乒乓球的有30人,同时选修篮球和足球的有10人,同时选修乒乓球和足球的有18人,同时选修篮球和乒乓球的有12人,问选修了三门科目的有多少人?





    根据上面的公式,可以15+20+30-10-18-12 + x =50。得x=25。

    思考一下?





 4.常见题目类型:

(1)排列问题:

    由0到9的数字组成排列,要求第一个数大于1,最后一个数小于8,一共有多少种排列?

(2)序列问题:

长度为n的由数字0,1,2组成的序列,要求每个数字至少出现1次,这样的序列有多少种?

(3)方程组整数解问题

   给出一个方程:x1+x2+x3+x4+x5+x6=20, 对于每个 0<=xi<=8,求解这个方程组有多少组解。

(3)区间内互素个数

       给出整数n和r。求区间[1;r]中与n互素的数的个数。

(4)至少一个被整除问题

       给出n个整数ai和整数r。求在区间[1;r]中,至少能被一个ai整除的数有多少。

(5)匹配字符串个数问题

       给出n个匹配串,它们长度相同,其中有一些’?’表示待匹配的字母。然后给出一个整数k,求能正好匹配k个匹配串的字符串的个数。更进一步,求至少匹配k个匹配串的字符串的个数。

(6)路径数据问题

    在一个的n*m方格阵中,有k个格子是不可穿越的墙。一开始在格子(1,1)(最左下角的格子)中有一个机器人。这个机器人只能向上或向右行进,最后它将到达位于格子(n,m)的笼子里,其间不能经过障碍物格子。求一共有多少种路线可以到达终点。

(7)数组四元组问题

       给出n个数a1,a2,a3....an,从其中选出4个数,使它们的最大公约数为1,问总共有多少中取法。

(8)和睦数三元组个数问题

(9)错排问题

作者:亿万年的星光 分类:C++知识 浏览:

【题解】吃糖果

【题目描述】

小明终于从小红手里赢走了所有的糖果,小明转变吃掉所有糖果,但是小明吃糖果有个特殊癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另外一种。试问小明是否存在一种吃糖果的顺序使得他能把所有的糖果都吃完。



【输入描述】

第一行有一个整数T,接下来T组数据,每组数据占两行,第一行是一个整数N (0<N<=1000000),第二行是N个整数,表示N种糖果的数目Mi(0<Mi<=1000000)



【输出描述】

对于每组数据,输出一行,包含一个“YES”或者“NO”。

【样例输入】

2  3  4 1 1  5  5 4 3 2 1

【样例输出】

NO  YES

【题解】组合数学

一、排列与组合口诀:有序排列,无序组合,分类相加,分步相乘。1.排列数公式:表示的含义是从n个数中选出m个进行排队,有多少种不同的排法。从n个不同的元素中任取m(m≤n)个元素的所有排列的个数,叫做从n个不同的元素中取出m(m≤n)个元素的排列数。排列与元素的顺序有关,组合与顺序无关。排列数公式:A(n,m) = n*(n-1)*...*(n-m+1)=n!/(n-m)!排列数公式中总共有m项乘积。常见的题目类别:捆绑法插空法代码模板(递归法):// 计算阶乘 int fa
作者:亿万年的星光 分类:C++知识 浏览: