codeforces的数论专题
个人在codeforces上的数论专题训练
黎辰
其实一切只为一个理由,一切理由在一个人面前也都沦为借口
展开
-
codeforces #334 div1 603C Lieges of Legendre(博弈)
题目链接:codeforces 603C题目大意:有两个人做游戏,游戏规则如下: 有n堆石子,每次可以对一堆石子进行操作,如果当前石子是偶数,那么可以选择将这2*x个石子分成k堆石子数为x的石子堆,还有一种没有前提的操作是取走当前堆的一个石子,问先手赢还是后手赢,先手和后手都足够聪明的情况下。题目分析:首先对于这种组合游戏的题目,很容易想到利用SG函数来解。我们对于游戏的局势进行分类讨论:当k是原创 2015-12-03 00:15:27 · 2463 阅读 · 0 评论 -
codeforces #334 div1 B 603B Moodular Arithmetic(数论)
题目链接:codeforce 603B题目大意:给出f(kx mod p)≡kf(x) mod pf(kx\ mod\ p ) \equiv kf(x)\ mod \ p,求满足条件的f(x)的数量。题目分析:首先考虑两种特殊情况,即k=0和k=1的情况。当k = 0 时, {f(x)=0f(x)={0,⋯p−1},x=0,x>0\left\{\begin{aligned}&f(x) =原创 2015-12-02 11:07:04 · 2276 阅读 · 2 评论 -
codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
题目链接:codeforces 453B题目大意:给出一个序列a,求取一个序列b,b序列的数两两互质,问能够导致∑|ai−bi|\sum | a_i - b_i|最小的方案题目分析:定义状态dp[i][j]表示前i个数达到j状态的最小的结果,j状态表示已经被用过的质数。因为当一个a的数据范围不超过30,所以如果某个数超过60,那么选择1一定比它更优,所以我们能够用到的数的质因子也一定不会超过60原创 2015-10-03 14:50:26 · 2007 阅读 · 0 评论 -
codeforces 201A A. Clear Symmetry(数论+构造)
题目链接:codeforces 201A题目大意:给出一个x,求一个边长最小的正方形矩阵,这个矩阵是01矩阵,且满足元素上下对称,左右对称,问构造出1的个数是x的矩阵最小的边长是多少。题目分析:首先我们能够发现若n-1构造的最大数比n构造出的最大数要大(n为偶数时)。然后我们知道对于每个奇数,能够构造出的最大数是n2+12\frac{n^2+1}{2}然后对于每个正方形矩阵,在横中轴线和纵中轴原创 2015-09-23 11:31:01 · 1474 阅读 · 0 评论 -
codeforces 276D D. Little Girl and Maximum XOR(贪心+dp+数论)
题目链接:codeforces 276D题目大意:给出l和r,用l和r之间的两个数取亦或,求得到的结果最大是多少。题目分析:首先我们想,为了让结果最大,肯定式尽量让高的位出现1,因为高的位出现1的情况是大于当前位是0且后面所有位都是1的情况的,那么我们就可以贪心的知道肯定是保证高位上的1先出现。然后我们可以想,让某一位出现1,那么就是选择一个数这一位是1,一个数这一位是0,然而我们为了让最后这两原创 2015-09-16 22:52:31 · 1706 阅读 · 0 评论 -
codeforces 385C C. Bear and Prime Numbers(线性筛素数)
题目链接:codeforces 385C题目大意:给出n个数,数据范围10710^7,给出m次查询,每次给出l,r求在l和r之间的素数的∑ki=0f(pi)\sum_{i=0}^kf(p_i),f(pi)f(p_i)定义为n个数中能够整除pip_i的个数。题目分析:直接线性筛素数,记录每个数最大的素因数,然后统计对于每个素因数对应的f(pi)f(p_i),然后求取前缀和,来方便求取区间和。AC代码:原创 2015-09-15 23:43:16 · 1643 阅读 · 0 评论 -
codeforces 2B B. The least round way(dp+数论)
题目链接:codeforces 2B题目大意:给出一个n*n的矩阵,从左上角走到右下角,只能向右或向下走,问路径上的数之积末尾0最少的方案是什么。题目分析:首先我们要做两个预处理,处理出每个位置上的数包含多少个2的质因子和多少个5这个质因子然后我们统计路径上弄到最少的2的方案数和最少的5的方案数。这个转移方程很简单:定义dp[i][j]为走到点[i,j]时最少弄到给定质因数的个数,a[i][j原创 2015-09-14 22:08:36 · 2598 阅读 · 0 评论 -
codeforces 172B B. Pseudorandom Sequence Period(暴力)
题目链接:codeforces 172B 题目大意:给出生成元,和递推式,求一个有限群元素的个数题目分析:暴力求取循环节即可,因为元素个数不会超过mod的大小,所以暴力法复杂度仅仅是O(105)\mathcal{O}(10^5)AC代码:#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#inc原创 2015-09-08 21:33:25 · 1202 阅读 · 0 评论 -
codeforces 225B B. Well-known Numbers(数论+二分+贪心+构造)
题目链接:codeforces 225B题目大意:定义f(k,n)为类似菲波那契数推导,只不过变为前k项的和,然后给出一个数s,利用k-菲波那契数构造出一个不重复的集合的元素和为s,集合的规模大于1题目分析:首先因为菲波那契数的增长速度快的吓人,所以给的数据范围10910^9很快就能达到,我们得到O(n)的构造出所有的可能用到的k-菲波那契数是可行的。然后就是构造如何构造的问题了。 因为题目保原创 2015-09-08 21:13:24 · 1638 阅读 · 0 评论 -
codeforces 267A A. Subtractions(辗转相除)
题目链接:codeforces 267A题目大意:给出一个数对,(a,b)每次用较大的减较小的,直到出现0为止,问要进行多少次操作。题目分析:大的减小的操作,可以利用取模优化过程,也就是辗转相除,商是操作次数,余数是下一段与之前较小的数继续进行操作的数,水题不做赘述。 AC代码:#include <iostream>#include <cstdio>#include <algorithm>#原创 2015-09-08 15:12:36 · 1266 阅读 · 1 评论 -
codeforces 225E E. Unsolvable(梅森素数+数学)
题目链接:codeforces 225E题目大意:给出一个等式,z=[x2]+y+x⋅yz=[\frac{x}{2}]+y+x \cdot y,求另这个等式无解的z,从小到大排序,访问第i个。题目分析:首先为了简便计算先要通过分奇偶去掉向下取整符号,原式转换为如下形式: {z=k+y+2ky ,x=2kz=k+y+(2k+1)⋅y ,x=2k+1(1)(2) \begin{aligned} \原创 2015-09-08 14:13:13 · 1424 阅读 · 0 评论 -
codeforces 396A A. On Number of Decompositions into Multipliers(组合数学+数论)
题目链接:codeforces 396A题目大意:给出n个数的序列,求取和这个序列的积相同但是序列本身不同的个数。题目分析:组合数学的问题,对于每一个数我们可以将它分解质因数,然后统计整个序列的各个质因数的个数。那么符合要求的序列一定用这些质因数(每个质因数的个数保持不变)组成的,所以我们可以利用组合数学中的插板法,对每个质因数进行划分,划分给n个数(存在一些数没有分到的情况),那么就是Cn−1原创 2015-09-08 10:09:15 · 1340 阅读 · 0 评论 -
codeforces 55D D. Beautiful numbers(数位dp+数论)
题目链接:codeforces 55D题目大意:求在[l,r]中能够整除自己每个数位上的数字的数的个数。题目分析:首先我们能够知道如果这个数能够整除它的每个数位上的数字,那么它一定能够整除他们的最小公倍数,是充要的。那么我们定义状态dp[i][j][k]代表i位在任意组合下得到的所有数位的数字的最小公倍数为j的每个数位上的数字之积%2520为k的方案数。我们可以知道所有的公倍数最大不会超过25原创 2015-09-07 22:11:27 · 1756 阅读 · 0 评论 -
codeforces 113C C. Double Happiness(数论+暴力)
题目链接:codeforces 113C题目大意:找出在[l,r]中的素数t,满足t=a2+b2(a,b为任意正整数)t=a^2+b^2(a,b为任意正整数),输出这种素数的数量。题目分析:首先筛出3⋅108所有为素数的奇数(偶数除了2都不可能是素数,为了节约内存)3 \cdot 10^8所有为素数的奇数(偶数除了2都不可能是素数,为了节约内存)然后枚举范围内的每一个数,判断这个数是不是4*k原创 2015-09-07 19:16:38 · 1875 阅读 · 4 评论 -
codeforces 251C C. Number Transformation(数论+dp)
题目链接:codeforces 251C题目大意:给出两个数a,b,k有两种操作,a-=1,或者a-=a%x(2<=x<=k),问最少需要多少步操作能够使a变成b题目分析:首先我们考虑数据范围小的怎么做,定义状态dp[i]表示从a到达i最少需要多少步定义状态dp[i]表示从a到达i最少需要多少步{dp[i−1]=min(dp[i−1],dp[i]+1)dp[i−i%x]=min{(dp[i−i%原创 2015-09-03 14:15:10 · 1449 阅读 · 0 评论 -
codeforces 337E E. Divisor Tree(数论+贪心)
题目链接:codeforces 337E题目大意:给出n个数,要求用到全部这些数,构建一棵每个点权值是孩子的权值之积,每个叶子节点的权值是一个质数的数,问这棵树最少需要多少个节点。题目分析:首先我们想到每个数必然导致的叶子节点的个数是它的质因数的个数(不去重)那么我们可以尽可能让两个数共用一个质因数。那么每个点如果不能和其他共用叶子节点的部分,肯定是直接伸出叶子节点,能共用的为了更大的节约,尽原创 2015-09-01 20:13:25 · 1366 阅读 · 2 评论 -
codeforces 415E E. Devu and Flowers(组合数学+容斥原理)
题目链接:codeforces 415E题目大意:给出n个盒子,每个盒子有fif_i朵花,每个盒子的花颜色相同,不同盒子的花颜色不同,问有多少种方案能恰巧选出s朵花。题目分析:直接做感觉比较复杂,所以想容斥的做法。如果不考虑每个盒子取的花有个数限制,那么结果是(n−1+s,n−1)(n-1+s,n-1),通过插板法获得的方案数。然后我们考虑对于每个盒子选取大于x个的方案数就是(n−1−x−1+原创 2015-09-01 16:46:34 · 1505 阅读 · 2 评论 -
codeforces 10C C. Digital Root(数论)
题目链接:codeforces 10C题目大意:定义d(x)d(x)为x的数字根,找出n以内的满足d(z)=d(d(x)⋅d(y))d(z) = d ( d (x) \cdot d(y) )但不满足x⋅y=zx \cdot y =z这样的x,y,z有多少组。题目分析:首先我们能够知道d(x \cdot y ) = d ( d(x) \cdot d(y) ),那么我们只要找出n以内的数的约数的个数,原创 2015-09-01 10:35:13 · 1503 阅读 · 0 评论 -
codeforces 446E E. Divisors(数论+暴力)
题目链接:codeforces 446E题目大意:给出一个x,k,每次操作都会将x分解因数,得到新的序列,然后每次再分解序列中的每一个数,按照每一个数分解因数从小到大排,整体顺序不做调整。题目分析:因为x是10^12以内的数,我们可以n√的预处理出x所有的因数,然后了解到其实每个因数如果一直分解深度是log(n)的复杂度,那么我们要得到这\sqrt{n}的预处理出x所有的因数,然后了解到其实每个因数原创 2015-08-31 09:48:00 · 1585 阅读 · 0 评论 -
codeforces 446C C. DZY Loves Fibonacci Numbers(线段树+菲波那契数的性质)
题目链接:codeforces 446C题目大意:给出一个数列,每次可以选取一个区间,按顺序加上第i个菲波那契数进行更新,也可以查询某一个区间的总和。题目分析:首先要做这个题必须了解菲波那契数的一些基本的性质 首先我们是可以通过每个菲波那契数列的前两项O(1)\mathcal{O}(1)的获得任意一项的数值和任意i项的前缀和。然后就是两个菲波那契数列相加之后依旧是一个菲波那契数列,只是前两项的原创 2015-08-30 16:11:31 · 1492 阅读 · 1 评论 -
codeforces 27E E. Number With The Given Amount Of Divisors(dp+数论)
题目链接:codeforces 27E题目大意:给出一个n,问最小的约数个数为n的数是多少。题目分析:作为一个懒人,看见这种数打不能取模的就喜欢用java水首先能够想到为了保证最小,最多也就用到17个质因数,因为这17个质因数的积已经超过了1e8,所以我们可以枚举这17个质因数出现的次数。然后定义状态dp[i][j]表示前i个质因数组成的因数个数为j个的最小的数。转移方程很简单:dp[i][原创 2015-08-28 20:07:24 · 929 阅读 · 0 评论 -
codeforces 134B B. Pairs of Numbers(枚举+辗转相除)
题目链接:codeforces 134B题目大意:给出一个数对(1,1),最少用多少次能通过a=a+b或b=a+b的操作变成其中一个数是n的数对。题目分析:暴力做,枚举数对中除n外的另一个数,然后辗转相除,每布操作一定是大的减小的,一直到1为止逆着做,然后比较得到最小次数,通过除法得到次数,通过取模得到下一种状态。AC代码:#include <iostream>#include <algorith原创 2015-08-28 16:15:36 · 1316 阅读 · 0 评论 -
codeforces 78C C. Beaver Game(数论+博弈)
题目链接:codeforces 78C题目大意:给出n个堆,每个堆都有m个,每次可以把一个堆分成一些相等的堆,分过的可以再分,轮流操作,不能操作的人输,问先手赢还是后手赢。题目分析:如果n是偶数,那么一定是后手赢,因为后手模仿先手的每一步即可。如果n是奇数,如果先手能够分当前的堆,那么他一定能够分出一定数目的不能继续操作的堆,所以相当于后手面对了先手偶数的局面,那么先手赢,如果不能分了,那么先手原创 2015-08-28 15:43:09 · 1149 阅读 · 0 评论 -
codeforces 222C C. Reducing Fractions(数论+构造)
题目链接:codeforces 222C题目大意:给出两个集合,第一个集合数的乘积是分子,第二个集合的数的乘积是分母,要求够造一个同样的集合,但是得到的分数是化简过的。题目分析:-首先筛出素数,然后处理每一集合,统计每个集合的各个质因数出现的次数,然后每个质因数减去两个集合较小的那个的质因数的个数,然后利用每个集合约分后剩下的质因数构造出合法解即可,采用的对于每个数,贪心的除去被约分掉的部分。 -原创 2015-08-28 14:16:48 · 753 阅读 · 0 评论 -
codeforces 121C C. Lucky Permutation(数论+构造)
题目链接:codeforces 121C题目大意:问字典序第k大的1~n的排列中的只由4和7组成的数为位置上具有相同性质的数的个数。题目分析:首先因为k≤109k \leq 10^9,所以需要变化的位最多只有13位,因为13位就可以导致字典序推进13!所以除了末尾的13个数位置有变化,其他的数的位置都没有变化,所以我们直接枚举符合条件的数的个数即可,因为他们的数值和下标相同,然后对于最后的13位原创 2015-08-26 20:17:50 · 913 阅读 · 0 评论 -
codeforces 348B B. Apple Tree(dfs+数论)
题目链接:codeforces 348B题目大意:给出一棵树和每个叶子节点的权值,每个点的值是它子树里的叶子节点的权值的总和,让每个节点的孩子的值都相等,只能通过缩减每个叶子的权值,问最少缩减的值是多少。题目分析:我们定义mul[MAX]数组代表某个叶子合法情况下应该占到整棵树权值的1mul[u]\frac{1}{mul[u]}我们进行一遍dfs,处理除叶子节点的mul的最小公倍数,这样能够保证原创 2015-08-26 12:05:04 · 942 阅读 · 0 评论 -
codeforces 449C C. Jzzhu and Apples(数论+构造)
题目链接:codeforces 449C题目大意:对1~n的自然数构成数对,每个数对中的两个数不互质,问最多能得到多少组数对。题目分析:对于每个大于2的素数,我们枚举它的倍数,得到个数,如果的得到的个数是奇数,我们可以通过舍去2*p这个数,得到正好偶数个,正好凑出数对,这样的方案一定是最优的。因为没有造成浪费。然后剩下2的倍数的数再进行组合,得到的就是最优解。 AC代码:#include <io原创 2015-08-25 20:08:43 · 770 阅读 · 0 评论 -
codeforces 474F F. Ant colony(线段树+数论)
题目链接:codeforces 474F题目大意:给出一些数,每次给出一个区间,所有的数两两比较,如果a能整除b得一分,b能整除a得一分,问没有得满分的有多少个。题目分析:我们可以知道,每个区间的数最多只有一种数字满足条件,也就是所有数的gcd,那么我们利用线段树,维护某一个区间的gcd,和这个gcd出现的次数即可,无修改的线段树水题 AC代码:#include <iostream>#inclu原创 2015-08-25 09:52:34 · 1294 阅读 · 0 评论 -
codeforces 498C C. Array and Operations(最大流+数论)
题目链接:codeforces 498C题目大意:给出一组数,然后给出他们之间的边,构成一张由奇数点和偶数点组成的二分图,然后存在边的数可以除以他们的公约数,问最多的操作次数。题目分析:为了得到了最多的操作次数,每次操作一定是除以两个数的公共的质因数。所以我们对于每一个质因数建图,原图中的边的两个点都存在这个这个质因数的连边,边权为两个点这个质因数的数量中较小的那一个,奇数点与源建边,边权为它存原创 2015-08-25 09:02:33 · 1240 阅读 · 0 评论 -
codeforces 17C C. Line(exgcd解不定方程)
题目链接:codeforces 17C题目大意:解Ax+By+C = 0题目分析:拓展欧几里得解不定方程模板题AC代码:#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long LL;LL exgcd ( LL a , LL b原创 2015-08-24 12:00:19 · 1115 阅读 · 0 评论 -
codeforces 401D D. Roman and Numbers(状态压缩dp+数论)
题目链接:codeforces 401D题目大意:给出一个数字num,和一个数字mod,重新排列num的数位上的数字,问能够得到整除mod的方案数。题目分析:首先我们定义SS为一个数字的集合,dp[s][num]表示利用S里的数字构成%mod的余数为num的方案数。那么初始状态就是dp[0][0]==1转移就是枚举每个数位上的数字,得到新的状态s|(1<< j),然后当前枚举的数字作为最后一位原创 2015-08-24 10:06:20 · 937 阅读 · 0 评论 -
codeforces 117B B. Very Interesting Game(同余模定理+取模导致的循环节)
题目链接:codeforces 117B题目大意:给出三个数a,b,m,将不大于a,b的两个数连接后得到一个新的数,如果这个新的数能够整除m,那么2赢,否则2赢。题目分析:因为取模会导致出现循环节,所以如果给出的数据范围大于mod,那么我们可以只考虑一个循环节,那么我们只需要预处理出b能够通过得到的值,然后枚举A,判断是否能出现一个A不能和任何一个B组合除能被mod整除的情况,那么这个数就是最小解,原创 2015-08-23 15:20:54 · 998 阅读 · 0 评论 -
codeforces 294C C. Shaass and Lights(组合数学)
题目链接:codeforces题目大意:给出一列灯,初始有一些点亮的灯,每次只能点亮与已经点亮的灯相邻的灯,问点亮所有灯的方案有多少种。题目分析:首先利用初始已经点亮的灯分段,最左侧和最右侧的两段因为只有一侧有灯,所以单论这一段的话,点亮的方案只有一种。对于中间的段落,因为两侧都有灯,所以每次都有两个灯备选,也就是有2n2^n中方案。然后因为各个段的点亮也有交叉的顺序,所以就是对于每一段采取类原创 2015-08-23 10:45:53 · 1569 阅读 · 0 评论 -
codeforces 354C C. Vasya and Beautiful Arrays( 数论+枚举)
题目链接:[codeforces 354C](C. Vasya and Beautiful Arrays)题目大意:给出一个数组,每个元素最多减少k,问能够调整出的整个序列的最大的gcd是多少。题目分析:容易想到我们可能得到的答案的上限就是maxi=1na[i]\max_{i=1}^n a_{[i]}.因为通过减k,一定能够调整为k+1的倍数,所以下限是k+1如果枚举答案,最坏依旧要枚举n次,原创 2015-08-21 16:23:50 · 982 阅读 · 0 评论 -
codeforces 66D D. Petya and His Friends( 数论+构造)
题目链接:codeforces 66D题目大意:要求构造出一个满足下列条件的数列: 题目分析:首先筛出100个素数然后先给这n个数每人一个素数(不同的)然后为了保证他们每两个之间的gcd都不等于1,那么我们找出6个素数(不同且没有用过的),然后将原数列分成四段,两两组合,组合在一起的用一个素数乘上去刷一遍,刷完之后依旧能够保证整个数列的gcd是1.注意3因为不够4个,所以要特判,2不能构造原创 2015-08-21 14:55:21 · 786 阅读 · 0 评论 -
codeforces 75C C. Modified GCD(二分)
题目链接:codeforces 75C题目大意:给出两个数,查询[l,r]内这两个数的gcd题目分析:对这两个数的cd进行打表,然后二分查找即可。AC代码:#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <vector>using namespace std;int a,b,原创 2015-08-21 14:00:51 · 998 阅读 · 0 评论 -
codeforces 16C C. Monitor(二分)
题目链接:codeforces 16C题目大意:给出长和宽,给出长宽比,缩短长和宽问最大的面积。题目分析:因为长宽比知道,除去长宽比的gcd,二分因数k即可,因为长宽一定是长宽比的k倍,且k相同。AC代码:#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;t转载 2015-08-21 13:33:29 · 1098 阅读 · 0 评论 -
codeforces 177B2 B2. Rectangular Game(数论)
题目链接:codeforces 177B2题目大意:给出n个点,每次排成a*b的矩形,每次留下b个,重新排,每次操作后剩下的点数的和最大是多少。题目分析:每次只需要将当前数的最小的质因数作为行数,这样能够保证剩下的最多,导致最终的结果最大。AC代码:#include <iostream>#include <cstring>#include <cstdio>#include <algorithm原创 2015-08-21 10:28:04 · 849 阅读 · 0 评论 -
codeforces 111B B. Petya and Divisors(数论)
题目链接:codeforces 111B题目大意:给出n次查询,每次给出x和y,要求找出x的因数中没有在前y个查询的数种出现的个数。题目分析:用一个mark[MAX]数组记录每一个数作为因子出现的最远位置。然后顺序操作每一次查询,枚举因子,判断因子之前出现的最远距离有没有出现在要求的范围内,如果没出现,更新答案。复杂都O(n⋅n√)\mathcal{O}(n \cdot \sqrt{n} )原创 2015-08-21 09:18:57 · 889 阅读 · 0 评论 -
codeforces 490D D. Chocolate(数论)
题目链接:codeforces 490D题目大意:给出两块长方形的巧克力,每次可以选择其中一块吃掉三分之一,或者吃掉一半,问最少多少次可以可以得到两块同样面积的巧克力。题目分析:首先求取两块巧克力面积的gcd,如果area1gcd和area2gcd\frac{area_1}{gcd} 和\frac{area_2}{gcd}的质因数只有2和3的情况下才能有解构建一组解的方法,就是记录两块巧克力质因原创 2015-08-20 09:48:02 · 617 阅读 · 0 评论