数论
timidcatt
永远不要放弃战斗
展开
-
小苯的三元组 2024年中国传媒大学程序设计大赛
因为lcm(a,b)=b,所以a是b 的因数,因为gcd(b,c)=b,所以c是b的倍数,那么我们如果知道b有多少个因数在数组中,记为cnt1[b],有多少个倍数在数组中,记为cnt2[b],那么以b作为三元组中间的那个数时就有cnt1[b]*cnt2[b]个合法三元组。题目大意:给出一个n个数的数组,问有多少个三元组(a[i],a[j],a[k])满足lcm(a[i],a[j])原创 2024-03-21 11:56:58 · 331 阅读 · 0 评论 -
Good Trip Codeforces Round 921 (Div. 2) 1925D
然后从2到k枚举每个匹配对被选中的次数i,被选中i次的累计贡献为(0+i-1)*i/2,因为每次被选中的概率psel独立等概符合二项分布,所以被选中i次的概率为C(i,k)*(psel)的i次方*(1-psel)的k-i次方,再乘以m,将所有贡献相加,注意预处理逆元和取模即可。考虑怎么算初始贡献的期望,每个匹配对被选中的概率psel=1/C(2,n),k轮中被选中的次数的期望就是k/C(2,n),再乘以贡献z,z*k/C(2,n)就是单个匹配对初始贡献的期望,可以O(m)的时间求出。原创 2024-01-29 16:17:36 · 544 阅读 · 0 评论 -
A Balanced Problemset? Codeforces Round 921 (Div. 2) 1925B
思路:我们设n个数的公因数是y,那么这n个数都应该是y的倍数,也就是y*n应该=n的最大的因数即可。题目大意:给出一个整数x,要求将x分成n份,使得所有份的最大公因数最大,求这个最大的最大公因数。原创 2024-01-28 15:39:50 · 566 阅读 · 0 评论 -
D. Yarik and Musical Notes Codeforces Round 909 (Div. 3) 1899D
思路:用快速幂打个表发现满足条件的a[i],a[j]要么a[i]=a[j]要么一个数等于1,另一个等于2,所以我们只需对于每个数,求出它后面有多少与它相等的数,如果是1或2再特判一下后面2或1的数量。题目大意:给出一个n个数的数组a,问有多少对i,j满足i原创 2023-11-18 14:34:12 · 272 阅读 · 0 评论 -
B. Long Legs Educational Codeforces Round 146 (Rated for Div. 2)
那么考虑x取何值时,(a-1)/x+1+(b-1)/x+1+x-1也就是(a+b-2)/x+x+1最小,我们发现此式的前一部分y1=(a+b-2)/x是单调递减的,y2=x+1是单调递增的,那么我们只要找到在哪里这两个函数的变化幅度相同,也就是求解y1=y2,移项化简得x约等于sqrt(a+b),根据a+b的范围和测试数据组数,我们从1到1e5枚举x,一定就能找到全局最小值。原创 2023-11-01 18:37:49 · 216 阅读 · 0 评论 -
D. Suspicious logarithms Codeforces Round 907 (Div. 2)
这时有两种情况,g(x)+1的地方也就是now*i有可能在当前枚举的区间外,这个区间的贡献就是(r-l+1)*cnt,另一种情况就是g(x)+1的地方在区间内,这个地方已知是now*i,那么这个区间的贡献就是(now*i-1-l+1)*cnt+(r-now*i+1)*(cnt+1),这样枚举i直到2的i次方大于上限R,就能得到g(x)x属于1到R的答案,我们令R=询问的r和询问的l-1,分别求出相减即可。原创 2023-10-31 22:21:23 · 450 阅读 · 4 评论 -
D. Counting Rhyme Codeforces Round 904 (Div. 2)
思路:如果两个数能同时被一个数整除,那么这两个数的最大公因数也能被这个数整除,所以如果一个数x在a中出现或者是a中的数的倍数,那么以x为gcd的数对都是非法的,如果不存在x%a[i]=0那么以这样的x为gcd的数对都是合法的。题目大意:有一个长度为n的数组a,如果对于一个数个(a[i],a[j])满足不存在a[k]既能整除a[i]又能整除a[j],则称这个数对是合法的,求合法数对的数量。原创 2023-10-24 09:27:28 · 194 阅读 · 0 评论 -
回文数 洛谷 - P1015
题目大意:给出一个数n和一个100位以内的n进制数s,每步操作令s=s+s的头尾翻转,问30步操作内最少多少步能将s变成一个回文数。思路:因为最多只有30步,100位数,所以模拟的时间复杂度肯定够,直接上高精度非10进制加法运算模板。2原创 2023-10-20 15:43:01 · 179 阅读 · 0 评论 -
D. Effects of Anti Pimples Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
思路:假如没有涂绿色这个操作,每次都只求黑色的最大值,那么对于每个数a[i],它的贡献就是在所有原创 2023-10-10 11:28:53 · 280 阅读 · 1 评论 -
Cheerleaders UVA - 11806
思路:因为合法的方案数不好考虑,所以考察不合法的方案数,我们设第一行没有黑格为A,第一列没有黑格为B,最后一行没有黑格为C,最后一列没有黑格为D,根据容斥原理有:非法方案数=-A-B-C-D+AB+AC+AD+BC+BD+CD-ABC-ABD-ACD-BCD+ABCD,这些都可以用组合数算,就是从除了选中行/列以外的格子里选k个,例如A=C[n*m-m][k],AB=C[n*m-n-m+1][k]。原创 2023-10-03 19:56:47 · 143 阅读 · 0 评论 -
A Yet Another Remainder The 2022 ICPC Asia Regionals Online Contest (II)
题目大意:有一个n位长的隐藏数x,从高位到低位依次标号为1到n,sum[i][j]表示从第i为开始每j位上的数的和,有q次询问,每次给出一个100以内除了5以外的质数p,问这个数%p等于多少。每个式子里后面括号中的数都是题目中给出的即sum[p-1][第i位],所以可以在O(qtp)的时间复杂度内求出。%p是有循环节的,且循环节的长度是p-1,那么我们可以将上式拆成p-1个式子例如第一个式子是。%p*(x[1]+x[p]+x[2*p-1]+...),第二个式子就是。%p=x,那么我们可以将每一项x[i]*原创 2023-09-09 22:34:11 · 205 阅读 · 0 评论 -
G. Replace With Product Codeforces Round 895 (Div. 3)
否则如果没有找到,因为数组最多2e5个数,所有数乘积1的位置L,R,如果[L,R]内的数的乘积>2*(R-L+1),[L,R]即为最优的区间。原创 2023-09-08 16:25:28 · 522 阅读 · 0 评论 -
C. Non-coprime Split Codeforces Round 895 (Div. 3)
题目大意:给出t个区间l,r,要求在每个区间内找到两个数a,b满足l原创 2023-09-08 16:01:28 · 471 阅读 · 0 评论 -
C. Divisor Chain Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)
思路:因为每个数的llowbit肯定是这个数的因数,那么我们把k拆成二进制,例如15就是1111,那么我们先操作3次就可以分别把它变成14,12,8,每个x都不会重复。题目大意:给出一个数k,每次操作可以选择当前k的一个因数x,并令k=k-x,要求令k变成1,且相同的x 出现次数不超过2,最大操作次数1000。接着再把其变成1,只要每次都除以2即可,每次使用的因数都是2的幂,也不会重复,这样两套操作下来相同的因数肯定不会超过2,总操作数不超过64。原创 2023-08-30 19:55:10 · 221 阅读 · 0 评论 -
XOR Subsequence 2023“钉耙编程”中国大学生算法设计超级联赛(10)hdu7390
那么直接求b数组的线性基即可,要注意的是线性基中数的个数肯能不足n个,要用0来补。题目大意:有一个n个数的数组a,对他们的所有非空子序列求异或和得到长度为。思路:可以发现,a数组其实是b数组的线性基。的数组b,给出b,求a。原创 2023-08-19 12:45:08 · 202 阅读 · 0 评论 -
Do You Like Interactive Problems?
题目大意:给出一整数n,有一个隐藏的在1~n范围内的数x,每次随机询问一个y,会得知xy,或x=y,当可能的x唯一确定时停止询问,问期望的询问次数是多少。,因为模数998244353在n的范围内,所以要用扩展欧几里得求逆元,或者将式子进一步化简得到(2n-1)/3,1的情况因为n-2原创 2023-08-18 11:43:19 · 142 阅读 · 0 评论 -
Permutation and Primes 2023牛客暑期多校训练营8 J
那么我们换一下a[1],令a[1]=2,发现n=12时有了合法构造,且发现无论是a[1]=1还是a[1]=2,用到的最大的质数就是13,那么我们猜想可以枚举极少的a[1]和质数就能得到合法答案,所以我们从1~n枚举第一个数,然后遍历后面的每一个位置,从小到大遍历质数,找到合法的数字就填进去,最后检验一下所有数字收否都出现过,如果不合法就换下一个a[1]。赛后验证了a[1]要么等于1可以有合法构造,1如果不行2就能有合法构造,且用到的质数不超过5个也就是不大于13,时间复杂度O(10n)原创 2023-08-11 20:53:49 · 521 阅读 · 0 评论 -
Rikka with Square Numbers 2023“钉耙编程”中国大学生算法设计超级联赛(8)hdu7370
设b=a-2,左式等于4a-4,也就是所有的4的倍数,那么所有4的倍数所需要的最少操作数也就是2,当b=a-3,b=a-4...时,可以发现得到的结论已经被包含在了我们上面得出过的结论里。考虑操作次数大于2的情况,因为已知奇数的操作次数不超过2,所以偶数最坏就是从相邻的奇数+1得到,操作次数为3,所以不满足上面所有条件的数就直接输出3即可。,假设b=a-1,将b代入化简可以发现左式等于2b-1,也就是左式的结果为所有的奇数,那么所有的不是完全平方数的数的最少操作数也就是2。原创 2023-08-10 21:02:04 · 225 阅读 · 0 评论 -
idol!! 2023牛客暑期多校训练营6 C
然后所有数对应减去他们本次提供的贡献后,可以发现前两组数剩余5的个数都变成了0,下一组变成了25~73的个数为1,75~123的个数为2,125~173的个数为4,也就是新的等差数列的每组大小变成了a*5,其余都不变,所以我们可以从5开始枚举a,直到所有数的贡献都被计算完毕。思路:因为末尾0的来源是2*5,而2的个数明显比5的个数多得多,所以末尾0的个数就等于有多少个5相乘。题目大意:·定义n!等于与n的奇偶性相同的所有小于等于n的数的阶乘之和,问n!原创 2023-08-07 11:20:41 · 412 阅读 · 0 评论 -
Distance 2023牛客暑期多校训练营6 B
然后发现最大的时间复杂度是n方,显然不能枚举所有几何,但我们可以枚举每一对数字,因为根据我们上面得出的策略,在每个集合中操作的数对都是相同的,所以我们可以求每一对数组需要的操作数*含有这个数对的集合数量假设我们在长度为7的数组中选中了a[3],b[4],那么根据范德蒙德卷积公式。题目大意:给出两个长度为n的数组a,b,每次操作可以令一个数+1,将a的一个子集A变成和b的一个子集B变成完全相同需要的最少操作数为C(A,B),求对于a的所有子集对所有b的子集的C(A,B)的和。原创 2023-08-05 20:45:37 · 505 阅读 · 0 评论 -
Gcd 2023牛客暑期多校训练营6 G
思路:不妨令x>y,因为我们可以得到x,y的最大公因数,然后我们可以用x不断减去最大公因数就能得到小于x的所有是gcd的倍数的数,但因为两个相间的数不能相等,所以如果初始两个数中没有0就得不到0,然后用1倍gcd减二倍gcd就能得到负一倍的gcd,再用y-负数就能得到所有大于y的gcd的倍数,所以只要z不等于0且z是gcd的倍数,就能输出YES。=y),每次操作可以将集合中任意两个不等的数的差放入集合或者将两个不等的数的gcd放入集合,给出一个数z,问z有没有可能出现在集合里。原创 2023-08-05 13:51:38 · 414 阅读 · 0 评论 -
Perfect square number 2023“钉耙编程”中国大学生算法设计超级联赛(6)hdu7341
思路:因为n的范围是300,所以我们可以遍历每一个数,用前缀和维护区间和,统计对于每一个包含这个数的区间,将它修改成哪些数,能够使当前区间的区间和变成完全平方数,那么变成的这个数的贡献就+1,修改后区间和的范围即为[sum[r]-sum[l-1]-a[i]+1,sum[r]-sum[l-1]-s[i]+300]题目大意:给出一个数组a,要将一个数修改成[1,300]内的任意一个数,问区间和是完全平方数的区间最多有多少个。的贡献,维护答案的最大值。原创 2023-08-05 12:31:58 · 260 阅读 · 0 评论 -
Expectation (Easy Version) 2023“钉耙编程”中国大学生算法设计超级联赛(5)hdu7330
然后注意到本题数据范围是1e6,且可能有10组1e6,如果O(nlogn)的话,超过1e8级别,比较极限,所以对于组合数也要预处理,即先预处理好1~1e6的阶乘数组和阶乘逆元数组,之后C(a,b)即b!)就可以O(1)求出。思路:因为每次事件相互独立,且只有输和赢两种结果,所以是一个二项分布,但每次事件的得分不同,所以要对赢几次分别求概率和得分相乘,最后再加起来就是总的期望,得分因为是递增的,所以用一个前缀和维护,每多赢一次,sum就加上赢得次数i的m次方。,每次求完一次,分子1*a,分子2除以b-a。原创 2023-08-02 10:08:37 · 273 阅读 · 2 评论 -
Cirno‘s Perfect Equation Class 2023牛客暑期多校训练营5 D
思路:如果我们知道一个b,那么就能找到与之唯一对应的一个a,而b是c的因数,也就是b不会超过sqrt(c)个,所以我们可以枚举c的所有因数注意检查是否符合题目条件。题目大意:有q次询问,每次给出三个整数k,c,n,求有多少满足条件的数对(a,b)满足ka+b=c且c是b的倍数,且gcd(a,b)>=n。原创 2023-08-01 10:25:05 · 549 阅读 · 0 评论 -
B. Longest Divisors Interval Codeforces Round 889 (Div. 2) 1855B
思路:首先有这样一个数学上的结论:在一个长为r-l+1的区间[l,r]中,一定能找到[1,r-l-1]中每个数的倍数至少一个,所以最长区间虽然能出现在很多地方,但从一开始的区间一定也是最长的,那么我们从1~n遍历,统计有多少个i能被n整除,遇到不能被整除的就直接输出答案。题目大意:给出一整数n,要求在1到n内找出一连续区间[l,r],使区间内每个数都是n的因数,求满足要求的最长区间的长度。原创 2023-07-31 09:34:29 · 342 阅读 · 0 评论 -
Merge the squares! 2023牛客暑期多校训练营4-H
思路:对于一个a*b(a>b)的矩形,我们可以用类似黄金分割的办法将其分割成cnt个b*b的正方形,然后剩下一个(a-cnt)*b*b的矩形,继续分割,一定能最后分割到剩下的矩形边长为1的情况,所以我们将一开始的大正方形分割成左上、右下两个边长分别为a,b的正方形,和剩下两个a*b的矩形,就可以完成题目要求。题目大意:有n*n个边长为1的小正方形摆放在边长为n的大正方形中,每次可以选择不超过50个正方形,将其合并为一个更大的正方形,求一种可行的操作使所有小正方形都被合并成一个n*n的大正方形。原创 2023-07-29 14:35:27 · 560 阅读 · 0 评论 -
E2. Rudolf and Snowflakes (hard version) codeforces1846E2
因为s最大是1e18,所以i理论最大值是62左右(赛后实际测出的最大值是58),k的最大值可以认为约等于1e9(因为优化效率极低,所有没有测k的最大值),这样我们可以枚举i,然后二分k,因为很明显i相同时,k越大,s越大,反之亦然,用s作为约束条件,这样的时间复杂度就是O(t*i*log1e9*log2i),2s可以稳过。因为s=1+k+k*k+k*k*k+...+k的i次方,可以看出这是一个等比数列,利用前n项和公式,得出。原创 2023-07-08 16:07:35 · 571 阅读 · 5 评论 -
G2. In Search of Truth (Hard Version) codeforces1840G2
思路:先输出333次1e6以内的随机数,维护得到的最大值ma,然后开始记录当前位置now,和每个数第一次出现的位置vis[input],输出333次1,输出1次ma,输出333次333,如果期间得到的是之前出现过的数,答案就是now-vis[input],可以认为此法得到答案的概率极大。题目大意:有一个隐藏的数n,第i次读入的数为a[i],第i次询问输出x,返回(a[i-1]+x)%n,要求在1000次询问内得出n。原创 2023-06-07 16:38:38 · 180 阅读 · 0 评论 -
D2. LuoTianyi and the Floating Islands (Hard Version)
当n为偶数时,同理也只有中间两个点之间的这些点满足条件,如果在这些点中挪动,那么到k/2个点的距离分别+1,到另k/2个点的距离分别-1,总距离不变,如果移出这个范围,到k/2+1个点的距离会分别+1,到k/2-1个点的距离会分别-1,所以总距离+1,所以对于每一个点,可行点数v就是一半子树放k/2个点,另一半子树放k/2个点,等于C(k/2,子树大小)*C(k/2,另一边的子树大小)总的放点t的方案数是C(k,n),然后因为我们遍历时是左闭右开的遍历,所以答案是1+v/t。原创 2023-06-01 18:20:14 · 97 阅读 · 0 评论 -
B. Make Array Good codeforces 1762B
如果当前数大于前一个数,那就让这个数变成离上一个数最近的倍数,这样+的x一定小于a[i-1],就i更不会大于a[i],且数字也不会修改大过2e9。题目大意:给出一个n个数的数组a,每次操作可以使任意一个数加上一个不大于他本身的数x,问能否使任意两个数都有一方能被整除。思路:我们先把数组从小到大排序,发现只要每相邻两个数能整除,那任意两个数都可以,所以。原创 2023-05-27 15:29:46 · 76 阅读 · 0 评论 -
C. Maximum Set codeforces1796C
1这样的数组的l的取值范围就是从l到r/2^(m-1),那么这样的数组的数量就是r/2^(m-1)-l+1,然后我们发现在*两次2之间还有可能是*一次3,因为*3是小于*4的,所以我们对于之前求出的一个合法数组,可以把任意位置上的*2替换为*3都是合法的,那么这样的数组的l的取值范围就是从l到r/2^(m-1)*2/3,对于每一个l,都有(m-1)种合法的替换,因为*其他数都不比*两个2或*1个3更优,所以答案就是这两种情况下的答案相加。原创 2023-04-14 10:30:26 · 113 阅读 · 0 评论 -
A. Serval and Mocha‘s Array codeforces 1789A
思路:求多个数的gcd时,随着数字增多,gcd不会变大,所以我们只要满足前两个数的gcd原创 2023-02-27 18:11:40 · 250 阅读 · 0 评论 -
D. Triangle Coloring codeforces1795D
或者两个三角形1红+2蓝和1蓝+2红,因为只有连接颜色不同的点的边才会被记录,所以显然后者权值才能最大,那么对于每个三角形,都可以将两条边的权值计入整幅图的权值中,要想选最大,也就是每个三角形要选出两个权值最大的边,我们暂时先不考虑这个三角形是1蓝2红还是1红2蓝的问题,如果这个三角形的三条边是形如4,2,2这样两条小边相等的情况,那我们可以选择1,2两条边或1,3两条边有两种情况,如果这个三角形是形如2,2,2这样三条边都相等的情况,那么我们可以选择1,2;原创 2023-02-18 17:30:01 · 357 阅读 · 0 评论 -
C. Remove the Bracket codeforces 1787C
所以当这个数小于等于s时,xi,yi中的最大值小于等于s,所以就是这个数本身,最小值就是0,当这个数大于s时,如果这个数小于等于两倍的s,那么最大值就是s,最小值就是ai-s,如果这个数大于两倍的s,那么最大值是ai-s,最小值是s,所以综上,这个数大于s时最大值就是max(s,ai-s),最小值等于ai-最大值。那么我们dp枚举即可,dp[i][0]表示当前数分成最大数在前,最小数在后,dp[i][1]表示当前数分成最大数在后,最小数在前,每个dp[i]都从dp[i-1]的两种状态中的最优值转移即可。原创 2023-01-30 17:15:26 · 430 阅读 · 0 评论 -
B. Number Factorization codeforces 1787B
题目大意:给出一整数n,将这个数分解成因数的幂的乘积,且这些因数的质因数不能重复,求最大的这些因数与他们的幂指数的乘积之和最大是多少。分解质因数只需要O(sqrt(n))的复杂度,因为一个数最多只有一个大于sqrt(n)的质因数,有两个的话相乘就大于了n。思路:因为这些因数的质因数不能重复,所以要想最大,只能将不同的因数乘在一起变成更大的因数例如864=,因为两个数相乘肯定比相加大,2+3原创 2023-01-30 16:26:17 · 346 阅读 · 0 评论 -
A. Exponential Equation codeforces 1787A
思路:可以发现,当x=1时,原式变为2*y=n,所以当n是偶数时,1,n/2即为答案,当n是奇数时,若x,y一奇一偶,都是偶数,矛盾,若都为偶数,同样得出来的是偶数,矛盾,若都为奇数,题目大意:给出一整数n,求两非零正整数x,y使。都为奇数,相加为偶数,矛盾,所以n是奇数时无解。原创 2023-01-30 15:21:47 · 321 阅读 · 0 评论 -
D. Friendly Spiders codeforces1775D
思路:因为n的范围是3e5,所以建图最大的时间复杂度就是nlogn,这样的话我们对于每个数,将这个数的下标与这个数的所有质因数建边,因为如果两个数的gcd不等于1,那么他们一定有相同的质因数,这样的时间复杂度就是nlogn,因为边权都是1,所以我们从起点开始bfs,第一次找到终点时一定是最短路径,bfs同时保存路径。题目大意:有n个点,如果有两个点的权值ai的gcd不等于1,那么这两个点之间是联通的,问两点之间的最短距离。原创 2023-01-19 21:28:19 · 100 阅读 · 0 评论 -
A. Greatest Convex codeforces 1768A
思路:通过样例很容易发现结论就是k=n-1,因为k>=2,0!=1,所以也没有不存在答案的情况,证明如下:((n-1)!)/n=(n-2)!题目大意:给出一整数n,求一整数k使得k!原创 2023-01-06 15:07:27 · 176 阅读 · 0 评论 -
C. Least Prefix Sum codeforces 1779C
所以从m开始向左累加的每一个和都应该是小于等于0的,那么我们从m开始向左遍历,如果当前遇到的数本身就是小于等于0的,直接累加即可,如果不是,我们先将其放入优先队列中,因为我们之后操作肯定是对最大的数进行操作取得的收益最大,然后我们加上这个数,判断如果当前的累加和已经大于0了,就要-2倍的优先队列堆顶的数,直到累加和小于等于0,特殊的是a1不需要任何处理。对于m右边的数,我们同样用之前的方法可以推出从第m+1个数开始,向右累加的每一个和都要大于等于0,向右遍历的操作也有上面类似,不再赘述。原创 2023-01-04 16:56:52 · 274 阅读 · 0 评论 -
B. MKnez‘s ConstructiveForces Task codeforces 1779B
所以相邻两个数是-2/1倍的关系,间隔一个数相等,n=7时,同理可得相邻两个数是-3/2倍,n=9时是-4/3倍,可以发现分母=(n-1)/2-1,分子等于分母+1,所有构造出的数组就是(n-1)/2-1,-(n-1)/2,(n-1)/2-1...题目大意:给出一整数n,要求输出一个长为n的数组,使得任意两个相邻数的和都等于所有数的和,且数组中不能出现0。可知每相邻两个数相反,间隔一个数相等,所以让数组为1,-1,1-1即可,n=6,8,10...时同理,思路:n=2时:显然任意两个数都满足条件。原创 2023-01-04 16:16:18 · 241 阅读 · 0 评论