![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数论
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P2261 [CQOI2007]余数求和(整除分块)
利用整除分块可以解决后面的求和部分,但是需要注意:k!=n,若,则,所以 是的最终位置,其不可以超过 nll go(ll n){ return n*(n+1)/2; }int main(){ while(~sdd(n,k)){ ll ans=(ll)n*k; for(ll l=1,r;l<=n;l=r+1){ if(k/l) r=min(k/(k/l),(ll)n); els...原创 2021-02-27 11:39:15 · 187 阅读 · 0 评论 -
牛客练习赛77 小G的约数(整除分块)
ll go(ll n){ return n*(n+1)/2;}ll G(int n){ ll ans=0; for(ll l=1,r;l<=n;l=r+1){ r=n/(n/l); ans+=(go(r)-go(l-1))*(n/l); } return ans;}int main(){ while(~sd(n)){ pll(G(G(n))); }}原创 2021-02-26 23:24:24 · 279 阅读 · 0 评论 -
Codeforces Round #701 (Div. 2) C. Floor and Mod(数论)
给出 x,y 使确定,满足且 以上条件的,<a,b> 有几组首先满足上述条件的一定满足,这里大家可以自己排除一下x,y 的范围都很大,要么 ,要么优化至首先妄图打表解决,最终可以发现,其中,所以得到,而这已经很接近的复杂度了放缩一下 ,,所以;最终可以得到 :,这样 k 就可以用来枚举了而 b 同样可以,,所以知道了 k,b 之后 a 便可以求出来,所以只要枚举 k 来统计答案即可int main(){ rus...原创 2021-02-25 15:44:08 · 132 阅读 · 0 评论 -
Educational Codeforces Round 104 (Rated for Div. 2) D. Pythagorean Triples(数学+枚举)
给出数 n,求三个数,且满足的勾股数有多少组与可以解得和由于每个数的范围都是,所以只能枚举 的值,这样复杂度就变为int main(){ //IOS; rush(){ sd(n); int ans=0; for(ll i=1;(i*i-1)/2<=n;i++){ ll a=i,b,c; if((a*a-1)%2) continue;...原创 2021-02-16 13:54:27 · 179 阅读 · 0 评论 -
Codeforces Round #698 (Div. 2) B. Nezzar and Lucky Number(数学)
有 n 个数,给出一个数 d定义好数,有一个 n 位数,只要有一位为 d,那么他是好数,多个好数之和也是好数判断这 n 个数是否为好数如果 x >=10d ,那么 10d+1,10d+2,……10d+9 都是好数,这样之后的数都可以凑出来 当 x<10d,如果 x 满足 10a+bd 的形式,a b 为任意数,那么就是好数const int N=1e5+5; int n,m; int i,j,k; int a[N];bool g...原创 2021-01-31 10:53:48 · 258 阅读 · 0 评论 -
第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 小宝的幸运数组(同余定理)
如果预处理前缀和,题目依然是的复杂度,所以采用其他的方法当时还想了一个二分的算法,但是二分必须满足单调性,但此题不满足在一个数列中 (a+b+c+d)%mod=k 其中 (a+b)%mod=k,那么 (c+d)%k=0,所以记录第一个 k 的位置,寻找之后的位置与其的最大值即可const int N=1e5+5; int n,m; int i,j,k; ll a[N];int main(){ //IOS; rush(){ ...原创 2021-01-30 22:32:52 · 212 阅读 · 0 评论 -
牛客练习赛66 C.公因子(数论)
题目用到了一个 gcd 的推论,和 CF 的题目类似 :BLOG求出 gcd 之后,要求出 x 的值,k*gcd=a[1]+x -> k*gcd-a[1]>=0,求解 k 的值带入原式求出 x 即可const int N=1e6+5; int n,m; int i,j,k; ll a[N]; signed main(){ //IOS; while(~sd(n)){ for(int i=1;i<=n...原创 2021-01-24 13:56:28 · 178 阅读 · 0 评论 -
Codeforces Round #691 (Div. 2) C. Row GCD(数论)
给出 n 个数,记为数组 a,给出 m 个数,记为数组 b,对于每一个数组 b 中的元素 x,输出 gcd(a1+x,a2+x,……an+x)假设有 3 个数 a,b,c,(a>b>c),这三个数 所以要求的那个式子就变成了其中 x 为 b 数组中的当前值,所以只需要预处理出除 a[1]+x 这一项的 gcd 即可const int N=2e5+5; int n,m; int i,j,k; ll a[N]; ll b[N];...原创 2021-01-23 20:09:00 · 189 阅读 · 0 评论 -
Codeforces Round #696 (Div. 2) B. Different Divisors(数学)
给出一个数 d,要求构造一个数 n ,要求 n 保证至少有 4 个因数,且每个因数的差值都要大于等于 d首先 1 一定是因数,按照贪心下一个因数最小是 1+d,第二个因数是 1+2d,那么答案是 (1+d)*(1+2d),加上本身一共四个因数 ,这样答案显然是不对的,如果 d 是奇数,那么一定存在 2,所以打破了这个规律我们要找的是质数,这样可以保证 d+1 至 2d+1 之间没有任何因数,所以找到质数 x,y,使得 x-1>=d 和 y-x>=d即可,x*y 即为...原创 2021-01-20 10:14:19 · 285 阅读 · 0 评论 -
洛谷 P5142 区间方差(线段树+数论)
关于求方差的题目之前做过,所以问题不算很难和这道题目很像:https://baichuan.blog.csdn.net/article/details/110707826区别是这道题目要用逆元求解,利用费马小定理预处理出前 n 个数的逆元即可解决问题const ll mod=1e9+7;const int N=1e5+5; int i,j,k; int n,m; ll a[N]; struct Node { int ...原创 2020-12-19 08:47:50 · 391 阅读 · 1 评论 -
Educational Codeforces Round 98 (Rated for Div. 2) D. Radio Towers(数学)
有 n+2 个发射站,编号为 0 和 n+1 的发射站不能被接收信号,编号为 1~n 的发射站都可以发射信号,信号强度为 c 时,可以传送至编号为 [i-c,i+c] 的发射站上,但是每个发射站只能有一个信号,每个发射站无论信号强度是多少其有信号的概率是 1/2,求 1~n 都有信号的概率是多少自己可以数一下当信号塔的个数为 [1,6] 时的概率,发现分子是斐波那契数列,分母是 2^n 题目很明显要用费马小定理求解逆元,所以算法复杂度 O( logn(mod-2) )c...原创 2020-11-20 11:37:33 · 410 阅读 · 0 评论 -
ZOJ 3233 Lucky Number(容斥原理×2)
给你 n 个幸运数字,和 m 个不幸运数字,定义好数:被任意一个幸运数字整除且不被任意的不幸运数字整除的称为好数,求 [L,R] 区间内有多少好数题目看起来不算很简单,开始先算在区间 [L,R] 内的幸运数字应该不算太难,利用容斥原理,奇加偶减,答案为 ans但是都不满足被不幸运数字整除就有点困难了,如果一个数 x 不能被任意一个不幸运数字整除,那么 x 一定不能被不幸运数字的 lcm 所整除,然后对于每一个幸运数字的倍数 t*a[i,j,k](t 为倍数) 与 lcm 的最小公倍数,...原创 2020-11-09 09:10:04 · 263 阅读 · 0 评论 -
SGU 551. Preparing Problem(思维+数学)
有 n 个项目,有两个人,第一个人花费 a 时间完成一个项目,第二个人花费 b 时间完成一个项目,但是当某一个人发现项目还未完成时,他会立马开始做下一个项目,只有完成手头上的项目时,才会停下来,中间不允许停止如果硬要模拟的话,考虑到的边界问题会很麻烦,但是题目的出口最后要么 a 完成最后一个任务,要么 b 完成最后一个任务所以以 a 或 b 为整段考虑,总的时间为他们其中的最大值,因为项目一旦开始无法停下int main(){ IOS; int a,b;...原创 2020-11-08 10:11:30 · 272 阅读 · 0 评论 -
POJ 1091 跳蚤(质因数分解+容斥原理+思维)
这个题挺考验思维的这个题目需要转化一下题意,假设有 n 张卡片由于向左向右并没有什么区别,所以题目可以转化为: a[1]*x[1]+a[2]*x[2]+……a[n]*x[n]+m*x[n+1]=1那么需要 gcd(a[1],a[2],……a[n],m) =1 才能满足题意,……(可能很多大佬一眼就能看出来,但是还是证明一下吧)证:当 gcd(a[1],a[2],……a[n],m) != 1 时, 方程两边可以同时除以 gcd,即方程变为: a[1]/gcd*x[1]+a[2]/gc...原创 2020-11-07 12:05:38 · 278 阅读 · 0 评论 -
HDU 4135 Co-prime(容斥原理+质因数分解)
求在一个区间 [a,b] 内,有多少个数与 n 互质将 n 质因数分解,利用容斥原理求解在 [1,a-1] , [1,b] 中有多少个数可以被 n 整除,剩下的数就是与 n 互质的数了 int i,j,k; ll n,m,t; //int a[N]; vector<int> prime;void get_factor(int n){ prime.clear(); for(int i=2;i*i<=n;i++)...原创 2020-11-07 10:45:44 · 189 阅读 · 0 评论 -
HDU 2841 Visible Trees(容斥原理+质因数分解)
有个人站在坐标 (0,0) 点处,从 (1,1) 开始有树,问在 (n,m) 的方格内,能看到多少棵树因为从原点看去,我们可以想象成一条正比例函数图像,即 y=kx ,当我们去看 (x,kx) 点时,会被 (x/gcd,kx/gcd) 的树所遮挡,所以我们只需要知道 gcd(x,y)=1 时的树有多少个即可就上述所说 gcd(x,kx)=1 时,当满足x=1 / k 不为整数的时候,而且当 x=1 时所可以看到的树,在 x=2 时不会再次看到,即不会有重复所以可以枚举 x ,对于...原创 2020-11-07 10:15:47 · 217 阅读 · 0 评论 -
Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) C. Division(思维+质因数分解)
输入 p q ,寻找一个最大的数 x,使得 x 整除 p,但是不满足 q 整除 xint main(){ IOS; ll p,q; rush(){ cin>>p>>q; ll ans=0; if(p%q){ cout<<p<<endl ;continue; } vector<int> v; v.clear(); ll tmp=q;..原创 2020-11-05 15:30:56 · 199 阅读 · 0 评论 -
Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum(数学+思维)
首先我们知道如果要枚举所有情况的话先要挑选 n 个元素 :但是 n =150 000,挑选出来再暴力的话一定超时但是可以发现,题目还是有突破点的我们先将 2n 个数排一下序,之后的数组均为排序后的数组 p将 a 数组存放 n 个递增数,b 数组存放 n 个递减数a 数组中 a1,a2,a3,……ai-1,ai, ai+1…aj-1,aj,aj+1…anb 数组中 b1,b2,b3,……bi-1,bi, bi+1…bj-1,bj,bj+1…bn现在如...原创 2020-11-05 15:14:57 · 163 阅读 · 0 评论 -
POJ 2603 Brave balloonists(质因子分解)
给出 10 个数,输出这 10 个数乘积的因子个数% 10 的结果这 10 个数 a[1]*a[2]*……a[10] 分解因子后,记fact(a[i])为将 a[i] 进行分解后的算术表达式, fact(a[1])*factor(a[2])*……fact(a[10])所以统计其中质因子 p[i] 总的个数及其幂次 c[i] ,答案为 (1+c[1])*(1+c[2])*(1+c[3])*…… int i,j,k; int n,m,t; int a[10];...原创 2020-11-02 22:25:29 · 182 阅读 · 0 评论 -
AcWing 213 古代猪文(中国剩余定理+卢卡斯定理+因数分解)
挺好的一道数论题目,知识点很全面由于 n,p 数值范围大,所以需要进行化简,首先易发现 999911659 是一个素数,所以利用欧拉函数的推论,原式:但是由于计算组合系数的过程中还是没有得到化简,但是观察 p={2,3,4679,35617} 可以分解成如此开始枚举 n 的因数,利用卢卡斯定理计算,在累加之后,拥有了 sum[i]=sum%p[i] 之后利用中国剩余定理,有四个方程,由于 p[]互为质数,所以求解 sum 时比较简单const ll mod=99...原创 2020-11-01 13:22:17 · 279 阅读 · 0 评论 -
POJ 1845 &&AcWing 97. 约数之和(费马小定理求逆元)
根据约数和的推论知道:A 分解质因数后为,那么可以分解成如下的形式对于每一个括号内的式子,我们可以利用等比数列求和公式来完成例如第一个括号可以等价为由于 mod=9901 为质数,所以很容易想到利用 费马小定理 去求解逆元,但是由于 p-1 可能会大于 mod ,所以 p-1 可能为 mod 的倍数关系,所以需要进行特判根据公式:其实也很好想,对于每一个括号内的 p ,对其求余数,都为 1,所以累计求和为 1*Ci+1最后不要忘记是求解就好,最后加个特判...原创 2020-10-29 16:06:53 · 204 阅读 · 0 评论 -
POJ3696 && AcWing 202. 最幸运的数字(欧拉函数)
8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字。现在给定一个正整数L,请问至少多少个8连在一起组成的正整数(即最小幸运数字)是L的倍数。输入格式输入包含多组测试用例。每组测试用例占一行,包含一个整数L。当输入用例L=0时,表示输入终止,该用例无需处理。输出格式每组测试用例输出结果占一行。结果为“Case 1: ”+一个整数N,N代表满足条件的最小幸运数字的位数。如果满足条件的幸运数字不存在,则N=0。首先做一步转化为 : 另 d.原创 2020-10-29 14:57:17 · 273 阅读 · 0 评论 -
POJ 2417 Discrete Logging(Baby-Step,Giant-Step)
给出 p,b,n,p 为质数,求中 x 的最小解,如果没有输出 no solution int n,m,t; int i,j,k; //int a[N];ll mul_mod(ll a,ll x,ll mod){ a%=mod; ll ans=0; while(x){ if(x&1) ans=(ans+a)%mod; x>>=1; a=(a+a)%mod; }...原创 2020-10-24 09:41:48 · 145 阅读 · 0 评论 -
P6786 「SWTR-6」GCDs & LCMs(数学推导)
刚开始做这个题的时候也是不清楚样例但是数学公式来的假设 y>x (y 是 bj,x 是 bi)x+y+gcd(x,y)= lcm(x,y)另 gcd = d,且知道 lcm=x*y/dx/d+y/d+1=(x/d) * (y/d)所以 (x/d-1)*(y/d-1) = 2所以 可以得到 y/d=3, x/d=2即 3x=2y根据上述推导 ,代码就出来了,对于每一个确定的 y ,去寻找数列中是否有对应的那个 x,之后此 x 变为 y,重复上述操作...原创 2020-10-22 20:42:40 · 240 阅读 · 0 评论 -
HDU 3579 Hello Kiki(中国剩余定理)
给出一个数 n ,再分别给出 2n 个数 a[i],和 r[i],表示n个同余方程组:x mod a[i]= r[i] , 求满足方程组的最小正整数 x,若不存在 输出 -1const int N=100+5;const ll mod=21252; int n,m,t; int i,j,k; ll a[N],r[N];ll ex_gcd(ll a,ll b,ll &x,ll &y) //ax+by=gcd(a,b){ ll g...原创 2020-10-20 17:57:32 · 220 阅读 · 1 评论 -
POJ 2115 C Looooops(一元线性同余方程)
输入 A,B,C,k,判断 for (variable = A; variable != B; variable += C) 循环执行几次题目转化为 (ans*C+A)=B(mod 2^k),求解一元线性同余方程裸题ll ex_gcd(ll a,ll b,ll &x,ll &y) //ax+by=gcd(a,b){ ll gcd=a; if(!b) x=1,y=0; else { gcd=ex_gcd(b,a%b,y,x...原创 2020-10-20 17:01:21 · 145 阅读 · 0 评论 -
POJ 2891 Strange Way to Express Integers(中国剩余定理)
题意:题目给定多个式子,xai(mod mi),因为不确定其中 ai,mi 的关系,也就是说不清楚是否互质,所以,例如有两个式子x=r1+k1*a1 -----(1)x=r2+k2*a2 -----(2)求 x ,根据扩展欧几里得原理,两式相等得:k1*a1-k2*a2=r2-r1,其中要满足r2-r1=k*gcd(a1,a2)所以利用函数 ex_gcd 求解 x 的答案,进而求得 k1 的值,这样 (1) 式就有了答案,因为 (1)式中的 x 的值同样要...原创 2020-10-18 12:14:09 · 590 阅读 · 1 评论 -
POJ 1006 Biorhythms(中国剩余定理)
根据题意,在同一天出现,满足 3 个 a[i]%xb[i] 的关系所以利用中国剩余定理,因为 23,28,33 互质,所以直接求解逆元即可。ll mod=21252; int n,m,t; int i,j,k; //ll a[N],b[N];ll ex_gcd(ll a,ll b,ll &x,ll &y) //ax+by=gcd{ ll gcd=a; if(!b) x=1,y=0; else { ...原创 2020-10-17 20:36:08 · 253 阅读 · 0 评论 -
1634:曹冲养猪(中国剩余定理)
利用中国剩余定理 求解 b[1]=n1%a[1],b[2]=n2%a[2], ……b[x]=nx%a[x]假设 m=a[1]*a[2]*……a[n]那么利用 ex_gcd(m/a[i],a[i],x,y)求解的是,两个互质的数 m/a[i],a[i] 的方程 ,即 x 为 m/a[i] 的逆元,这样在 *余数 b[i],就可以得到除 a[i] 之外的所有数的公倍数 ni,且 ni 还满足 ni%mb[i]const int N=1e3+5;ll mod=1e9+7; ...原创 2020-10-17 19:54:58 · 687 阅读 · 1 评论 -
POJ 1061 青蛙的约会(扩展欧几里得)
x+nt-(y+mt)=kL -> kL+t(n-m)=x-y这样就变成了我们熟悉的 ax+by=c 的形式,其中 k,t 为未知量利用扩展欧几里得求解之后,因为 ax+by=k*gcd两边同时除以 gcd 所以变为 a' x+b' y=k此时 a,b 互质,相比于真正的欧几里得 ax+by=1 得到的答案 x 的值应扩大 k 倍最后求解最小的正数 x 的解即可ll ex_gcd(ll a,ll b,ll &x,ll &...原创 2020-10-17 18:30:34 · 184 阅读 · 0 评论 -
裴蜀定理 && 扩展欧几里得算法求逆元详解
裴蜀定理 :有一个线性不定方程ax+by=c若此方程有解,那么 c=k*gcd(a,b) ,k 为任意正整数证明:以下 gcd(a,b) 简称 gcd(ax+by) mod gcd=0又 c mod gcd=0(ax+by-c) mod gcd=0ax+byc(mod gcd)证毕当 ax+by=c 成立时,c=k*gcd特殊的:当 a,b 互质时,方程满足 ax+by=1扩展欧几里得算法:如何求解上述方程:因为涉及...原创 2020-07-25 16:09:44 · 2316 阅读 · 0 评论 -
POJ 2800 && UVa 1363 Joseph‘s Problem(分块求余)
给出 n,k 求 (k mod i)原创 2020-07-25 15:01:45 · 146 阅读 · 0 评论 -
POJ 3641 Pseudoprime numbers
如果 p 不是素数,且,则 p 称为伪素数,给出 p,a,判断 p 是否为伪素数 int n,m,t; int i,j,k;bool judge(int n){ for(int i=2;i*i<=n;i++){ if(n%i==0) return 0; } return 1;}int pow_mod(ll a,ll index,ll mod){ ll ans=1; while(index){ ...原创 2020-07-22 11:16:09 · 159 阅读 · 0 评论 -
POJ 2478 Farey Sequence(欧拉函数)
求 1~n 内与 n 互质的个数,phi[1]=0const int N=1e6+5; int n,m,t; int i,j,k; int phi[N];void get_eular(){ for(i=0;i<N;i++) phi[i]=i; phi[1]=0; for(i=2;i<N;i++){ if(phi[i]==i){ for(j=i;j<N;j+=i){ ...原创 2020-07-22 10:44:47 · 150 阅读 · 0 评论 -
UVa 10006 Carmichael Numbers (快速幂)
给出一个合数 n ,如果对于任意数 a 都有 (2<=a<=n-1) a^n mod n =a ,则称 n 是一个卡迈克尔数.给出一整数n,判断其是否是卡迈克尔数如果数 n 本身为质数,即使通过费马测试也不是卡迈尔数 int n,m,t; int i,j,k;ll pow_mod(ll a,ll x,ll mod){ ll ans=1; while(x){ if(x&1) ans=ans*a%mod;...原创 2020-07-21 22:35:19 · 200 阅读 · 0 评论 -
HDU 1286 找新朋友(欧拉函数裸题)
int Eular(int n){ int ans=n; for(i=2;i*i<=n;i++){ if(n%i==0){ ans=ans/i*(i-1); while(n%i==0) n/=i; } } if(n>1) ans=ans/n*(n-1); return ans;}int main(){ //IOS; rush(){ ...原创 2020-07-21 21:19:02 · 293 阅读 · 0 评论 -
费马小定理证明及应用
费马小定理的证明:----------来自 费马小定理先给出完全剩余系的定义:完全剩余系:从模n的每个剩余类中各取一个数,得到一个由n个数组成的集合,叫做模n的一个完全剩余系。a,b 互质说明 GCD(a,b)=1如果 a1,a2……,am 是 mod m 的完全剩余系,且b 与 m 互质,证明:a1*b , a2*b ……, am*b 也为 mod m 的完全剩余系证明:假设存在 ai*b = aj*b (mod m),因为是完全剩余系,所以只需要证明假...原创 2020-07-19 09:29:45 · 600 阅读 · 1 评论 -
POJ 2551 Ones(水题)
输入 n,求 111……11 %n==0 ,最少有多少个 1int main(){ //IOS; while(~sd(n)){ int ans=1; for(i=1;;i++){ ans=(ans*10%n+1)%n; if(ans==0) break; } pd(i+1); } // PAUSE; return 0;}...原创 2020-07-18 15:34:17 · 173 阅读 · 0 评论 -
POJ 2545 && HDU 3199 Hamming Problem
给出三个质数 a,b,c,以及数 k ,求在一个集合中只有 a / b / c 为因数的第 k 大数const int N=1e5+5; int n,m,t; int i,j,k; ll ans[N];int main(){ IOS; for(ll a,b,c;cin>>a>>b>>c;){ ll k; cin>>k; ans[0]=1; ll p...原创 2020-07-18 15:13:47 · 164 阅读 · 1 评论 -
POJ 2247 && HDU 1058 Humble Numbers
定义一种 humble数,使得其中的元素的素数因子只能是 2 / 3 / 5 / 7要求这个集合的第 n 个数是多少const int N=6e3+5; int n,m,t; int i,j,k; int a[N];/*int prime[N],num;bool vis[N];void init(){ for(i=2;i<N;i++){ if(!vis[i]){ prime[++num]=i;...原创 2020-07-18 15:02:14 · 155 阅读 · 0 评论