数论
文章平均质量分 67
h_tour
这个作者很懒,什么都没留下…
展开
-
洛谷P3911 最小公倍数之和 莫比乌斯反演经典转换
题目链接题解:刚拿到这道题目,发现是nnn个离散的数,很难处理。因此,我们需要对问题进行转化:∑i=1N∑j=1Nlcm(i,j)∗cnt[i]∗cnt[j]\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)*cnt[i]*cnt[j]i=1∑Nj=1∑Nlcm(i,j)∗cnt[i]∗cnt[j]cntcntcnt表示该数出现的次数。下面可以对上面的式子进行化简:∑i=1N∑j=1Nlcm(i,j)∗cnt[i]∗cnt[j]\sum_{i=1}^N\sum_{j=1}原创 2021-05-31 21:10:49 · 97 阅读 · 0 评论 -
Codeforces 894 B. Ralph And His Magic Field (组合数学)
题目链接题意:给一个n×mn×mn×m的矩阵,现在要给每个位置填数,只能填111或−1-1−1,问有多少种方法能够使每行每列乘积均为kkk,k∈{−1,1}k\in\{-1,1\}k∈{−1,1}题解:先考虑k=1k=1k=1的情况,我们先给前n−1n-1n−1行前m−1m-1m−1列填好数字,这时可以随便填,因此现在的方案数就是2p, 其中p=(n−1)∗(m−1)2^p,\ 其中p=(n-1)*(m-1)2p, 其中p=(n−1)∗(m−1)。填完之后,我们再填前n−1n-1原创 2021-04-22 12:15:27 · 94 阅读 · 0 评论 -
CF1152C Neko does Maths
题目链接题意:给我们两个整数aaa和bbb,让我们给a,ba,ba,b同时加上一个非负整数kkk,使得lcm(a+k,b+k)lcm(a+k,b+k)lcm(a+k,b+k)最小,如果lcmlcmlcm一样小,则让kkk最小。输出kkk。题解:a和ba和ba和b可以表示成:a=x1∗g+y,b=x2∗g+ya=x_1*g+y,b=x_2*g+ya=x1∗g+y,b=x2∗g+y。其中,ggg是aaa和bbb的最大公约数,yyy是他们共同的余数。那么我们其实要做的就是把余数yyy补上一个kkk,原创 2021-04-19 18:22:26 · 78 阅读 · 0 评论 -
51nod 1350 斐波那契表示
题目链接参考链接题解:没有思路先打表观察,可以发现函数f[i]f[i]f[i]有规律,会出现斐波那契数列式分层:1 12 13 1 24 1 2 25 1 2 2 2 36 1 2 2 2 3 2 3 37 1 2 2 2 3 2 3 3 2 3 3 3 4可以发现前nnn项的和可以预处理其中的一部分,由于斐波那契数列增长速度接近指数,因此所需要的数组大小不会超过100。剩余的数可以依据一定的规律进行处理。实现细节见代码:#include <bi原创 2021-04-09 18:09:15 · 80 阅读 · 0 评论 -
hdu 5894 hannnnah_j’s Biological Test
题目链接题意:nnn个座位要安排mmm个人,每两个人之间至少隔kkk个位置,求方案数。题解:因为mmm个人之间有mmm个空隙,我们设第iii空隙为aia_iai,因此有a1+a2+⋯+am=n−ma_1+a_2+\dots+a_m=n-ma1+a2+⋯+am=n−m,这里ai≥ka_i\geq kai≥k,我们可以改写成b1+b2+⋯+bm=n−m−m∗kb_1+b_2+\dots+b_m=n-m-m*kb1+b2+⋯+bm=n−m−m∗k,这里bi≥0b_i\geq 0bi≥0,原创 2021-04-01 15:37:15 · 66 阅读 · 0 评论 -
51nod 1670 打怪兽
题目链接题解:因此前一轮和后一轮的关系密切,可以使用递推解决。令dp[i]dp[i]dp[i]表示第iii轮依然存活时的方案总数,此时的能量一定是iii。显然dp[0]=n!dp[0]=n!dp[0]=n!,因为,无论怪物怎么排列,第0轮一定是存活的。我们找到现在能够打败的怪物数量xxx,其中这些怪物已经被打败的是iii个。因此,此时我们可以求出第i+1i+1i+1轮我依然存活的概率是x−in−i\frac {x-i}{n-i}n−ix−i,只要将这个概率乘上dp[i]dp[i]dp[i],我原创 2021-03-31 19:05:05 · 81 阅读 · 0 评论 -
hdu 5698 瞬间移动
题目链接题意:从左上角开始移动,每次可以选择右下方的一个格子移动过去,求到第nnn行mmm列的格子的方案数。题解:枚举到(n,m)(n,m)(n,m)总共需要移动的步数kkk。那么容易发现kkk步走到(n,m)(n,m)(n,m)的方案数其实就是Cn−2k−1∗Cm−2k−1C_{n-2}^{k-1}*C_{m-2}^{k-1}Cn−2k−1∗Cm−2k−1,预处理阶乘和逆元可以很快做出这题。实现细节见代码:#include <bits/stdc++.h>using names原创 2021-03-31 17:57:23 · 90 阅读 · 0 评论 -
poj2409 Let it Bead
题目链接题意:给我们mmm种不同颜色的珠子,每种颜色的珠子数量无限。现在我们要从中挑nnn个珠子,穿成一个环形手链,问能够制造多少种不同的手链。如果两个手链经旋转或翻转后能够完全重合在一起,对应位置的珠子颜色完全相同,则视为同一种手链。题解:这道题目是PolyaPolyaPolya定理的模板题。对于这道题目,首先我们要考虑有几种置换方式。不难发现有两种,分别是旋转和翻转。先分析旋转置换。我们可以发现,根据一个珠子旋转的次数,这种置换方式总共有nnn种情况,也就是一个珠子旋转kkk次,其中k=0原创 2021-03-29 16:40:56 · 80 阅读 · 0 评论 -
Burnside引理与Polya定理
基本概念置换形如:其实和映射差不多,111映射为p1…p_1\dotsp1…。循环置换形如:如果根据映射关系画一张图的话,循环置换的图应该是如下形式:两者的关系:任何一个置换都可拆成若干个循环置换的乘积。置换群从1−n1-n1−n所有的置换方式应该有n!n!n!种,包含其中若干种置换方式的群称为置换群。BurnsideBurnsideBurnside引理概念每个置换的不动点个数的平均值就是不同的方案数。不动点可以通过下面这个例子理解:假设现在对于一个环的染色方案如下:原创 2021-03-29 15:28:12 · 263 阅读 · 0 评论 -
hdu 3949 XOR
题目链接题意:给我们nnn个整数,让我们从中至少选取一个进行异或运算,问我们第kkk小的结果是多少?题解:发现nnn的数量较大,因此暴力肯定不行。为了将处理的数据范围减小,我们可以使用线性基处理。我们发现,每个数的二进制位也就63位,因此采用线性基处理之后,得到的无关组的向量个数最多636363个,相比之前的1e41e41e4,数量已经大幅减少。由于题目要求至少取一个进行异或运算,因此,我们需要对原来的向量组能否取到000进行特判。方法就是,比较当前的无关组的向量个数ddd与之前向量组向量个数nn原创 2021-03-26 17:22:59 · 58 阅读 · 0 评论 -
P3812 线性基
题目链接题意:给我们nnn个整数,让我们从中选任意个整数,使得他们的异或和最大。题解:这道题目nnn的数据范围给的不是很大,不能很好的感受到线性基在减少处理空间上的重要作用,其实这道题目nnn的范围可以加到1e51e51e5。直接想枚举所有的数的组合显然不行。看到了异或和,我们可以想到进制。根据线性基的做法,我们可以将所有的整数看作一个向量组,每个向量的维度也就是他们的进制位数,这道题是50。接下来,我们要求出这个向量组的极大线性无关组,使用高斯消元。将每个数转换成二进制,从高位到低位每次找到所原创 2021-03-26 16:01:46 · 79 阅读 · 0 评论 -
线性基
介绍一些基本概念向量组例如:x1,x2,…,xkx_1,x_2,\dots,x_kx1,x2,…,xk这么一组向量就可以称之为一个向量组。相关概念线性相关如果一个向量组当中,某个向量可以被该向量组中的其他向量表示出来,那么称这个向量组是线性相关的。线性无关如果一个向量组当中,任何一个向量不可以被该向量组中的其他向量表示出来,那么称这个向量组是线性无关的。线性空间形如{a1x1+a2x2+⋯+akxk∣ai∈R}\{a_1x_1+a_2x_2+\dots+a_kx_k|a_i\in R原创 2021-03-26 15:46:55 · 487 阅读 · 0 评论 -
斯特林数
斯特林数有两类,分为第一类斯特林数和第二类斯特林数。其中第一类斯特林数又有无符号版本和有符号的版本。这里主要介绍无符号版本。第一类斯特林数定义将1−n1-n1−n划分为kkk个圆排列的方案数,这kkk个圆排列相互之间没有顺序。记作s(n,k)s(n,k)s(n,k)或[nk]\begin{bmatrix}n \\k \end{bmatrix}[nk]。求法[nk]=[n−1k−1]+(n−1)[n−1k]\begin{bmatrix}n \\k \end{bmatrix}=\begin{bma原创 2021-03-24 14:50:24 · 264 阅读 · 0 评论 -
洛谷P2303 Longge的问题
题目链接题意:给定一个整数nnn,让我们求出表达式∑i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n)∑i=1ngcd(i,n)的值。题解:首先,我们可以发现这个最大公约数一定是nnn的约数。因此我们可以进行分类,也就是枚举nnn的约数。然后原来的表达式就可以改写成:∑d∣nd∗\sum_{d|n}d*∑d∣nd∗最大公约数为d的个数,也就是有多少个xxx满足gcd(x,n)==dgcd(x,n)==dgcd(x,n)==d。这个个数该怎么求?我们发现,如果有gcd(x,n)==原创 2021-03-16 19:01:05 · 103 阅读 · 0 评论 -
51nod 1103 N的倍数
题目链接前缀和+抽屉原理题意:给了一个长度为nnn的数组,从中任意找到若干个数,它们的和是nnn的倍数。题解:这里可以使用抽屉原理,模nnn的余数总共有nnn个。如果出现前缀和模nnn等于0,表明这前iii个数的和一定是nnn的倍数;反之,如果没有前缀和等于0,那么此时前缀和模nnn的余数只有n−1n - 1n−1个,因此对于这nnn个数的前缀和来说,一定会有2个前缀和模nnn的余数相同,那么在这之间的所有数的和模nnn一定等于0,也就是nnn的倍数。实现细节见代码:#include <原创 2021-03-05 16:20:37 · 44 阅读 · 0 评论 -
51nod 3038 数列求和
题目链接题意:给定两个数nnn和kkk,求∑i=1nik mod 10007\sum_{i=1}^ni^k\ mod\ 10007∑i=1nik mod 10007的值题解:容易发现直接暴力枚举的时间复杂度是O(nlogn)O(nlogn)O(nlogn),而nnn的数据范围比较大,因此暴力不行。我们可以考虑到,这里的模数10007比较小,因此,我们可以从每个数模10007的余数下手。利用这个同余,我们发现1k,10008k,20015k,…%100071原创 2021-03-04 20:08:36 · 417 阅读 · 1 评论