
数论,数学
无愧于人
鸣蜩二九~
一岁有一岁的味道,一站有一站的风景。
花会沿路盛开,以后的路也是。
展开
-
Codeforces Round #688 (Div. 2) C. Triangles(思维,数学)
题目传送题意:给你一个n*n的矩阵,上面写着0到9的数字,现在问你:选取同一种数字中的任意三个,组成的三角形的最大面积 * 2是多少,每选取一种数字的时候,你最多可以改动一次,使得某个位置变成你想要的数字,在这个数字选取完后,改动的数字变回原样。思路:1.既然每次可以改一次,那么肯定只要存在俩个点那么三角形面积就不会为0.那么我直接枚举俩个点就是了,另外一个点配合选取的俩个点使得面积最大即可,但是暴力选取俩个点会T2.我们知道三角形面积是 底乘高除二 ,那么既然另外一个点是我们可以控制的,可以配合原创 2020-12-05 14:46:11 · 359 阅读 · 0 评论 -
HDU -Cup(二分)
题目传送二分半径比体积没啥好说的,主要是这个体积公式圆台体积公式:π * h * ( r *r + R * R + R *r)/3水当高度为x时,上底半径为:(R - r) * x / H + r上底半径差在高度的几份,再加上最小半径AC代码#include<bits/stdc++.h>#include<iostream>#include<stack>#include<algorithm>#include<queue>#原创 2020-12-03 00:14:59 · 145 阅读 · 0 评论 -
欧拉函数及其性质与证明
欧拉函数:欧拉函数是求1到n-1中与n互质的数,特殊的 φ(1)=1欧拉通项(也就是公式):其中pi是n的质因子。证明:由于在1到n中pi (也就是质因子) 的倍数是均匀分布的,那么,去掉这些质因子的倍数(占1/pi)就是x * (1 - 1/pi)那么同理,其他质因子也按照这个来,就得到了上述公式求单个欧拉值直接用唯一分解O(sqrt(n))就可以求得欧拉值模板 cin >> n; ll num = n; for(int i = 2;i *原创 2020-12-02 23:06:56 · 2036 阅读 · 0 评论 -
POJ - The Euler function (欧拉筛,埃氏筛求1到n的欧拉值)
题目传送欧拉塞 算出 (1到n) 欧拉函数值AC代码#include<bits/stdc++.h>#include<iostream>#include<stack>#include<algorithm>#include<queue>#include<deque>#include<vector>#include<map>#include<set>#include<cmath原创 2020-12-02 20:29:12 · 149 阅读 · 0 评论 -
POJ -2407 Relatives (欧拉函数)
题目传送求单个数的欧拉值,板子AC代码#include<bits/stdc++.h>#include<iostream>#include<stack>#include<algorithm>#include<queue>#include<deque>#include<vector>#include<map>#include<set>#include<cmath>#i原创 2020-12-02 19:11:51 · 159 阅读 · 0 评论 -
中国剩余定理
借鉴大佬的博客中国剩余定理模板代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = get原创 2020-12-01 22:59:58 · 97 阅读 · 0 评论 -
洛谷 - 因子和
题目传送题意:思路:肯定是唯一分解,然后就是自己推公式了公式:那么这个怎么快速的求得呢?我们看到,这是个等比数列求和的乘积等比数列求和的公式是:n为第n项,我们可以利用逆元来快速求解但是现在还有一个问题每当逆元不存在的时候,怎么办?也就是说当p-1是 模数的倍数的时候,怎么求呢?首先有公式:但是没有什么用,我们可以观察到,当p-1是mod的倍数的时候,那么p%mod也就是1那么直接带入计算的式子中有以下推论:最后一个坑点,因为要取模,后面又要-1,可能为负数。。。。。题原创 2020-11-27 23:23:28 · 207 阅读 · 0 评论 -
洛谷 - 组合数问题(杨辉三角预处理加dp)
题目传送杨辉三角预处理阶乘: c[1][1]=1; for(int i=0;i<=2000;i++) c[i][0]=1; for(int i=2;i<=2000;i++){ for(int j=1;j<=i;j++){ c[i][j]=(c[i-1][j]+c[i-1][j-1])%k; } } 模数为kdp部分(其实也就是杨辉三角的性质) for(int i=2;i<=2原创 2020-11-25 23:34:16 · 295 阅读 · 0 评论 -
洛谷 - 康托展开与逆康托展开
题目传送AC代码明天补原创 2020-11-19 00:37:30 · 233 阅读 · 0 评论 -
洛谷 - 线性求逆元
题目传送题意:证明:AC代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getch原创 2020-11-18 23:06:32 · 195 阅读 · 0 评论 -
洛谷 - P1082 同余方程 (扩展欧几里得)
题目传送扩展欧几里得板子题用来求方程的整数解,由于这里求的是最小正整数解,所以求出来特解再利用通解公式判断一下就可以了扩展欧几里得AC代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0原创 2020-11-16 22:49:12 · 233 阅读 · 0 评论 -
数位dp - 例题
HDU - 4734dp[pos][sum]sum表示在当前位置下,还可以放多少权值的数AC代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0' && c <= '原创 2020-11-13 21:00:31 · 114 阅读 · 0 评论 -
数位dp - 板子题
题目传送存一个状态就可以了,用来判断前一位是不是6的情况具体看代码注释AC代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0' && c <= '9') {x =原创 2020-11-12 23:35:42 · 199 阅读 · 0 评论 -
数位dp
数位dp就是,把一个数按每一位数字来dp,然后计数满足条件的数的数目在不同的限制条件下,有不同的状态,需要用另一维来保存条件状态在计算数目的时候,需要看目前的状态来不同计算和记忆化数目数位dp的实质就是一种优雅的暴力借用大佬博客代码typedef long long ll;int a[20];ll dp[20][state];//不同题目状态不同ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要原创 2020-11-12 23:24:28 · 144 阅读 · 0 评论 -
高斯消元法模板题
链接AC代码#include <bits/stdc++.h>inline long long read(){char c = getchar();long long x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}retur原创 2020-11-12 15:00:54 · 290 阅读 · 0 评论 -
高斯消元法
高斯消元法是用来解决n元联立方程组的把方程组转化成增广矩阵,然后转化成上三角矩阵形式(每次变换一行中的那个位置),那么方程组的解就可以很方便带入计算三角形的最后一行的那个数即是Xn的解,然后再带入上一行,解出Xn-1,然后依次继续恒等初等变换1.交换方程组中俩个方程的位置2.把一个方程替换成它的非零倍3.把一个方程替换为它和另外一个方程倍数之间的和或差板子O(n3) double arr[100][100],b[100]; int n,m; cin >>原创 2020-11-12 00:03:12 · 286 阅读 · 0 评论 -
2020 China Collegiate Programming Contest Changchun Site D - Meaningless Sequence(组合数学)
题目传送题意:就是求那个函数的值思路:首先我们可以看到,ai 都是c的幂次方那么每一个ai的值有什么规律呢?其实题目已经给出提示了,n是由二进制给出的。那么我们给a这个数组的前n项和他的下标二进制比较,那么我们可以看到:下标的二进制中1的数量有多少(num),那么a[i] = cnum。那么规律找出来了,接下来就是组合数学问题了。就是在给定的n中,选多少个1和多少个0的问题。但是不能超过n假如n = 100010100011001(二进制表示),我们怎么组合数学呢?我们先假设从左向右下标原创 2020-11-11 21:15:05 · 232 阅读 · 0 评论 -
数论 - 例题
巨大的菲波那切数列输入数a,b,n(0 <= a,b <= 264,1 <= n <= 1000),求f(ab)%n,f(num) = f(num-1)+f(num-2),f(0)=f(1)=1。求f(ab)%n。思路:等价于求 (f(ab - 1)%n + f(ab - 2)%n)%n,而观察一下n较小,那么最多也就n种余数。那么f(num)有几种组合呢?看似只有n种,因为只有n个余数,但是这样的话我们就要看他的排列问题了,这样又会无解。但是f(num) = f(num-原创 2020-11-11 19:26:31 · 178 阅读 · 0 评论 -
数论 - 同余与模算术
(a + b)mod n = ((a mod n) + (b mod n)) mod n(a - b) mod n = ((a mod n) - (b mod n) + n) mod n (在a大于b的情况下)ab mod n = (a mod n)(b mod n) mod n大整数取模:求n%m,(n <= 10100, m <= 109)把大整数写成自左向右的形势,如 1234 = ((1*10 + 2) * 10 + 3) * 10 + 4然后每步取模。 string原创 2020-11-11 11:01:07 · 191 阅读 · 0 评论 -
数论 - 扩展欧几里得算法求 方程的整数解
题意:直线上的点。求直线ax+by+c=0上有多少个整点(x,y)满足x∈[x1,x2],y∈[y1,y2]扩展欧几里得算法:求ax + by = gcd(a,b)解void gcd(int a,int b,int& d,int& x,int& y){ if(!b) {d = a;x = 1;y = 0;} else {gcd(b,a%b,d,y,x);y -= x*(a/b);}}求出来的x1和y1是一组解设另外一组解x2和y2,则有:a * x1原创 2020-11-09 21:29:15 · 455 阅读 · 0 评论 -
数论 - 筛法进阶
题意:给出正整数n和m,求区间内的"无平方因子"的数有多少个?(1<= n,m <= 1e12 , m-n <= 1e7)原创 2020-11-09 20:40:40 · 177 阅读 · 0 评论 -
数论 - 除法表达式
题意:给你x1/x2/x3…/xn问是否有可能在其中添加一些括号使得结果为整数解:首先x1无论怎么添加括号也是分子再观察其余部分x2/x3…/xn,我们可以x2/(x3/x4…xn),那么x2无论怎么添,都是分母,其余的都能成为分子即转化为:x1 * x3 * x4…*xn / x2可以唯一分解,也可以每次除gcdgcd的最大递归层数: 4.785lgN + 1.6723递归层数最多的是菲波那切数列由唯一分解定理:a = p1e1 * p2e2 … pnenb = p1f1 * p2原创 2020-11-09 15:02:24 · 279 阅读 · 0 评论 -
Codeforces Round #677 (Div. 3) E. Two Round Dances(数学)
题目传送题意:给你n个人(一定是偶数),现在让你分成俩组。每一组都围成一个圈,问有多少种不同的排列方法。思路:1.首先,分成俩组,那么 1 2 3 和 4 5 6 这一组与 4 5 6 和 1 2 3这一组肯定是一样的。所以我们有C(n/2)/n 再除2 种选法。2.然后他们是围成一个圈,那么 1 2 3 4 与 2 3 4 1 与 3 4 1 2 与 4 1 2 3都是一样的。所以一个圈有(n/2)种 除n 种排法(因为是一个圈)。那么最后化简下来就是:n! / 2 / (n/2) /原创 2020-10-21 13:17:29 · 252 阅读 · 0 评论 -
AtCoder Beginner Contest 177 C.Sum of product of pairs(数学,前缀和)
题目传送题意:给你n个数,要你求模上1e9+7的结果思路:观察一下可得乘法分配律,所以我们把分配律合并一下即可,那么我们求一个前缀和,则每一个数对答案的增值为这个数乘以他后面所有数的和取模得写好,不然爆数据AC代码#include <bits/stdc++.h>inline int read(){char c = getchar();int x = 0,s = 1;while(c < '0' || c > '9') {if(c == '-') s = -1;c =原创 2020-08-29 22:15:07 · 356 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) B. Ternary Sequence(思维,数学)
题目传送题意:给你a,b俩个数组,数组中只有0,1,2三种元素,a中有x1个0,y1个1,z1个2。b中有x2个0,y2个1,z2个2。现在你可以任意排列俩个数组,然后对应位进行如下操作合成c数组问最大的c数组的和是多少思路:我们先分析,哪些对答案有贡献。2 对 0 ,2 * 0 = 0,无贡献2 对 1 ,2 * 1 = 2,贡献22 对 2 , 贡献01 对 0 , 贡献01 对 1 , 贡献00对任何数也是0所以不难发现,对答案有贡献的只有2和1这一对所以我们贪心匹配:1原创 2020-08-22 11:27:46 · 194 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) A. Distance and Axis(思维,数学)
题目传送题意:给你一个点A(n,0),现在要求你找到一个整数x,使得abs(x - (abs(n-x)) == k,给出n和k,现在你可以进行操作n+1,或者n-1多次,问最少多少次操作使得有非负整数x的存在思路:1.当n都小于k的时候,那么在n前面找一个点使得上述等式成立那是必不可能的,所以我们只有将n一直加到k,然后x选择0即可2.当n大于x的时候,有等式x - (n-x) == k,(因为是对称的,所以这里我们直接假设x大于(n-k))那么化简得到x = (k+n)/2,要x为整数,当(k+原创 2020-08-22 10:50:58 · 206 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) C. Mere Array(数学)
题目传送题意:给你n个元素的数组,现在规定如果gcd(a,b) == Min(数组中的最小值),那么则可以交换a,b的值,现在问,是否能通过这个操作,使得数组不递减思路:1.我们先对改数组排个序,然后进行操作后的数组必须和现在排序后的数组一样。2.然后我们把没排序的数组与排了序的数组相对应,看看相同的位置上,那些数不同,那么不同的数的位置是肯定被交换了的。3.在这些肯定被交换了的数上,我们只需要判断gcd(a,Min) 是否等于Min即可。为什么这样判断呢?假设现在能交换乘不递减的数组,那么原创 2020-08-22 10:30:44 · 214 阅读 · 0 评论 -
Codeforces Global Round 10 B. Omkar and Infinity Clock(数学)
题目传送题意:给你一个大小为n的数组a,还有一个正整数k,问进行k次操作后,数组是什么样,一次操作:对于每一个位置i 用数组中的最大值-ai替换思路:现在的数组中肯定是有一个最大值的,那么在一次操作后,Max(最大值)的位置一定会变成0,然后又会形成一个新的最大值,此时数组中肯定有Max和0的存在,然后进行操作后,Max变成0,0变成Max,继续下去这就是一个循环。例:5 -1 4 2 0第一次变0 6 1 3 5第二次变6 0 5 3 1第三次变0 6 1 3 5…这就是一个循环AC原创 2020-08-17 10:53:10 · 212 阅读 · 0 评论 -
2020牛客暑期多校训练营(第九场) E.Groundhog Chasing Death(数论,质因数分解,费马小定理)
题目传送借鉴大佬的博客思路:真的是搞人,一个bug能找俩小时把题意转化求这个等式,其中aa表示的是x中数值为p的质因子的个数,bb表示的是y中数值为p的质因子个数因为求他们的gcd就相当于求其质因数分解后的每个质因子的最小数目的乘积。然后再算每个质因子对答案的贡献。详细看大佬的博客叭,太详细了 Orz这里需要用到:a ^ b % p == a ^ (b%(p-1)) % pAC代码#include <bits/stdc++.h>inline long long read(原创 2020-08-11 23:35:08 · 221 阅读 · 1 评论 -
尺取法基础介绍
尺取法模板题:给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度输入n = 10,m = 155 1 3 5 10 7 4 9 2 8输出2尺取法模拟过程:第一步 先找到第一个大于m的区间5 1 3 5 10 7 4 9 2 8第二步 删除第一个元素,再添加后面的元素,直到重新大于m5 1 3 5 10 7 4 9 2 8第三步 以下一直同第二步5 1 3 5 10 7 4 9 2 8第四步5 1 3 5 10 7 4 9 2 8第五步5 1 3 5 10原创 2020-08-10 20:54:28 · 133 阅读 · 0 评论 -
POJ - Permutations(群论,置换群)
题目传送很好的置换群的入门题,题目中已经把上面是置换群是什么讲得很清楚了每一个数都有一个循环节长度,所以要满足要求就求所以循环节的长度的lcm即可。这里要说的是:如果一个数已经出现过了(前面计算循环节的时候记录过),那么在后面遇到这个数的时候,这个数的循环节也和在记录另外一个数的循环节长度一样,所以可以不管(可以减少时间复杂度)AC代码#include <bits/stdc++.h>inline int read(){char c = getchar();int x = 0,s =原创 2020-08-08 23:10:09 · 215 阅读 · 0 评论 -
除法分块 - 数论
问题:当我们暴力的时候时间复杂度为O(n),但是我们可以把时间复杂度降到O(sqrt(n)),这点时间优化在数论中可是不能小视的。除法分块所谓分块,就是把一段数分成不同的区间,而这些区间的每一个数除以同一个数的值是相同的,所以我们就把这些区间统一处理,就不用再来一个一个遍历例: 问题中我们假设n = 10。那么我们现在分一下{1},{2},{3},{4,5},{6,7,8,9,10},分别分成这几块因为他们除以n的值是相等的那么我们用代码怎么分呢?先贴模板: ll l = 1,r,n;原创 2020-08-02 22:35:55 · 1029 阅读 · 1 评论 -
拓展欧几里得求方程整数解和逆元
什么是拓展欧几里得?所谓拓展,就是在欧几里得的基础上得出的推论。拓展欧几里得就是根据欧几里得的原理(辗转相除),可以算出二元一次方程组的整数解和乘法逆元拓展欧几里得:ax + by = c我们知道这个方程组在实数范围内是有无数个解的。但是在整数的范围内他却存在着有限个解。首先介绍裴蜀定理这里再证明一下:为什么在整数解的情况下,c一定是gcd(a,b)的倍数呢?例:2 * x + 4 * y = c那么c无论如何都是偶数,换句话来说,c一定是2的倍数2 = gcd(2,4)3 * x原创 2020-07-24 22:16:06 · 389 阅读 · 0 评论 -
分数取模(费马小定理)
费马小定理:若p是质数,且p与a互质,有等式:a^(p-1) %p == 1 % p那么我们在这上面变一下型:俩边同除aa^(p-2)%p == a^(-1)%p那么我们再在俩边同乘b(b / a)%p == b*a^(p-2)%p所以分数b/a 模 p的结果就为b* a^(p-2)%p这其实也是求出了其除法逆元...原创 2020-07-23 14:27:51 · 4660 阅读 · 5 评论 -
2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(数学)
题目传送题意:给出1 - n的数字,让选择m对数字,让gcd(a_i,b_i)>1,让m尽可能大,并且输出这m对对应的数字。思路:既然要m尽可能的大,那么肯定就是要求配对的越多。那么需要配对得越多,那么就需要充分的利用他们每个数的因子,来进行某种完美匹配,以达到最多的匹配数目,那么我们就想这种匹配方法就可以了完美匹配的方法:用埃氏筛来进行变化,筛出每个数的质因子个数,质因子种类数,以及最小质因子和拥有每种质因子的数集合。 for(ll i = 2;i <= n;原创 2020-07-21 16:55:59 · 158 阅读 · 0 评论 -
2020牛客暑期多校训练营(第四场) B.Basic Gcd Problem(数学)
题目传送题意:给定一个函数给你x和c,问这个函数的值是多少?思路:首先得把这个函数看懂,要是看都没看懂,还怎么做题。举个例子:f(8)的最大值为 f(8) = c * f(gcd(8,4) == 4),那么f(4) = c * f(gcd(4,2) == 2) , f(2) = c * f(gcd(2,1) == 1) = c综上:max f(8) = ccc可以注意到,这个函数的递归退出条件就是gcd(i,x) == 1的时候,这时的f(1) = 1,那么既然退出递归的时候f(x)的原创 2020-07-20 15:28:23 · 1253 阅读 · 0 评论 -
Codeforces Round #657 (Div. 2) B. Dubious Cyrpto (思维,数学)
题目传送题意:给定l , r , m 。让你求出等式中的a,b,c 。 m = n*a + b - c,其中n是任意的正整数,l <= a,b,c <= r思路:既然n是任意的正整数,那么我们直接枚举a的情况,再来判断b-c的情况。1.先在 l 到 r 的范围枚举a,那么这个时候的b-c有俩种情况就是n*a 或者 (n+1)*a,但是这里有个坑,就是n必须大于0,所以我们就得先判断(n+1)*a,因为这种情况一定是大于0的。2.那么我们a可以枚举,我们怎么判断b和c呢?就只用保证原创 2020-07-19 21:56:06 · 177 阅读 · 0 评论 -
更相减损数
上次做了个题,用到了这个的一点原理,原来以为会用辗转相除法就可以了。。。。更相减损术很简单:古文原文:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。算法思想就是:俩数相减(大减小),然后用减出来的数替换掉大的那个数,然后重复,直到减出来的数和上次的减数相等,则停止,这个数就是俩者的最大公因数。例:12 4第一步:12 - 4 = 8,替换后数为 8 4第二步为:8 - 4 = 4,现在的的减数与减出来的结果相等,那么4就是他们的最大公约数之所以不常用原创 2020-07-10 00:00:53 · 649 阅读 · 0 评论 -
裴蜀定理基本介绍
题目传送门裴蜀定理也叫做(贝祖定理)定理内容:如果方程 ax + by == c,如果x,y的解为整数,那么c一定是gcd(a,b)的倍数。//gcd(a,b)为a,b的最大公约数博主的粗略证明(不知道对不对哈。。。。)当x,y都等于1的时候:a%gcd(a,b) == 0,b%gcd(a,b) == 0.那么(a+b)%gcd(a,b) == 0,而c == a+b;当x,y任意取时...原创 2020-03-11 23:00:09 · 2279 阅读 · 1 评论 -
洛谷 -P1147 连续自然数和 (数论)
题目传送题意:思路 :首先我们知道连续的自然的和的公式为:(L+R) * (R-L+1)/2根据题意我们得出:(L+R) * (R-L+1) == 2*n我们假设现在k1 * k2 == 2*n,且假设k2 > k1那么k2 = (L+R),k1 = (R-L+1),根据这俩个方程得出:L = (k2 - k1 + 1) / 2R = (k1 + k2 - 1) / 2那么L,R必定为整数,所以又得出,k1,k2肯定一奇数一偶数那么我们现在就枚举k1来获得k2,再来判断成立原创 2020-07-08 00:15:33 · 655 阅读 · 0 评论