数论
数论
_不动明王
自从厌倦于追寻,我已学会一觅即中。自从一股逆风袭来,我已能抵抗八面来风,驾舟而行。
展开
-
快速幂和快速幂取模
【二进制快速幂】对于幂计算mn,比如57,我们可以将7改写为二进制111,然后可以对57进行分解。57=3^(1*2 ^ 0)3^(1 * 2 ^ 1 ) 3^(1 * 2 2);不难发现,分解后每项的指数的计算,我们可以发现我们把原本的6次乘法变成了,2次乘法,当然在计算机里面没有乘法的概念,乘法其实质就是累加,从这个方面来看,其提升的效率比我们想象的还要大。下面我来讲讲具体实现。1.首先我们来实现每项指数的递增,也就是2^0-> 2^1-> 2^2(1->2->原创 2021-07-09 18:44:48 · 139 阅读 · 0 评论 -
线性筛+合数的唯一分解
我们学过Eratosthenes筛法,它的思想是:从2开始找素数的倍数(1倍、2倍、3倍,,,)为合数。它的缺点是会重复筛除一些合数 (像筛除3* 5*之后又会筛除5 *3)而快速线性筛法原理:任何合数都能表示成一系列素数的积,且每个合数必有一个最小素因子。快速线性筛法的特点就是不会重复筛除一个合数。设合数 i=p1p2…*pn, pi都是素数(2<=i<=n),pi<=pj ( i<=j )由上可知p1是合数i的最小素数。这样每一个合数就有一个确定唯一的表示方法(像28=原创 2021-07-08 11:20:41 · 151 阅读 · 0 评论 -
选择与除法(唯一分解定理+阶乘质因子分解技巧+Eratosthenes筛法求素数)
选择与除法已知C(m,n) =m!/(n!(m-n)!),输入整数p, q,1,s ( p=q , r2s , p.q ,7,s≤10000 ) ,计算C(p,q)/C(r,s)。输出保证不超过108,保留5位小数。【分析】1.预处理素数表,分解每一个1~100002.2.将乘除法变成素数指数的加减法(唯一分解定理)C(p,q)/C(r,s)=p!s!(r−s)!/r!q!(p-q)!值得注意的是可以通过阶乘质因子分解公式来提高我们的效率。阶乘质因子分解公式:N的阶乘的质因子m的指数:X原创 2021-07-07 18:27:14 · 130 阅读 · 0 评论 -
最小公倍数的最小和
最小公倍数的最小和题目:输入整数n ( 1≤n<2^31),求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小。输出最小的和。【分析】设唯一分解式n=a1p1*a2p2*…ai^pi,不难发现每个ai为素数时为最优解。听起挺高大尚的,其实实现起来和简单,就是不断的对n从2进行判断,可以除尽,俩者尽行相除,最后当n为素数时结束。当然,当n为1和素数时,要进行特殊处理,也就是求和的时候要多加1.#include <iostream>#include <math.h&原创 2021-07-06 10:30:06 · 231 阅读 · 0 评论 -
无平方因子的数
无平方因子的数给出正整数n和m,计算区间[n,m]内的"无平方因子"的数有多少个?整数p无平方因子,当且仅当不存在k>1,使得p是k2的倍数。(1<n≤m≤1012 ,m-n≤107)【分析】1.直接枚举肯定超时。另一种办法和Eratosthenes筛法思路差不多1.筛法求出所有素数。2.对于不超过√m的所有素数p,筛掉区间[n, m]内p^2的所有倍数。#include <iostream>#include <vector>#include <原创 2021-07-05 11:10:57 · 467 阅读 · 0 评论 -
Eratosthenes筛法求素数
Eratosthenes筛法对于不超过n的每个非负整数p,删除2p, 3p,4p,…,当处理完所有数之后,还没有被删除的就是素数。用shu[i]表示i已经被删除。 vector<int> shu(n+1,1); for (int i=2;i<=n;i++ ) { if(shu[i])//i为素数 { for(int j=i*i;j<=n;j+=i) {原创 2021-07-05 11:00:47 · 194 阅读 · 0 评论 -
数论-整数对
整数对考虑一个不含前导零的正整数X,把它去掉一个数字以后得到另一个数Y。输入X+Y的值N(1<=N<=10^9),输出所有可能的等式X+Y=N。例如N=34有两个解:31+3=34;27+7=34。思路:1.记N的10进制表示形式的长度为L.2.设从x右边数的第i(0<=i<L)位删除数字d(0<=d<10)得到Y(如图)3.记X=a10(i+1)+d10i+b,(b<10i),则Y=a10i+b,且X+Y=N;由此可得11a10i+d10^i+2b=N原创 2021-07-04 18:39:52 · 929 阅读 · 0 评论