- 博客(259)
- 收藏
- 关注
原创 D. Strange Definition
传送门题意:给你一个数列,数列中互相之间满足lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)开方后是整数的可以构成一个多重集合,每过一秒数列中的所有数都会变为他们的乘积,问第w秒的时候,数列中最大的多重集合中的元素个数。思路:通过观察式子lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)可以知道同属一个集合内的元素需要满足何种性质。对每个数分解质因数,则x=p1k1∗p2k2∗∗∗pmKmx=
2022-04-04 13:31:30
357
原创 P1386 座位安排
传送门题意:有n个位置,m个人已经被安排好了座位的编号,现在问你剩下的人安排座位编号的方式有多少种。思路:计数dp,先求出对于当前位置i来说可安排编号的最大人数bib_ibi,设dp[i][j]表示编号安排在i位置到n位置的人数,则对于dp[i][j],我们枚举有k个人的编号被安排在i位置,则dp[i][j]+=dp[i+1][j-k]+cbikc_{b_i}^kcbik。#include<bits/stdc++.h>using namespace std;#define
2022-03-26 17:17:19
681
原创 P1360 [USACO07MAR]Gold Balanced Lineup G
传送门题意:有n天,m种能力,每天给你一个数x,每天提升的能力用该数的二进制表示,1为提升,反之则不,问你最长的连续几天提升的每种能力相同的天数。思路:对于每一种能力值,可以通过前缀和来计数,而如果第l天到第r天满足要求,设bit[i][j]表示第i天第j种能力值的前缀和,那么显然可以得到:bit[r][1]−bit[l−1][1]=bit[r][2]−bit[l−1][2]=......bit[r][m]−bit[l−1][m]bit[r][1]-bit[l-1][1]=bit[r][2]-bi
2022-03-24 22:47:25
622
原创 P1286 两数之和
传送门题意:给你n的数的两两之间的和,求这n个数。思路:设这n个数从小到大分别为x1,x2…xn,n个数的两两之和为a1,a2......an∗(n−1)a_1,a_2......a_{n*(n-1)}a1,a2......an∗(n−1),枚举x1,在每次枚举中,将a遍历,并标记,对于每个ai,若当前的ai未标记,则说明该ai可以写为x1+xkx_1+x_kx1+xk的形式,然后求出xkx_kxk,并将已推出的x和xkx_kxk相加的和标记。#include<bits/st
2022-03-23 17:56:53
371
原创 P1013 [NOIP1998 提高组] 进制位
传送门题意:给你一个由字母代表数字的加法表,问你这个加法是几进制以及每个字母所代表的数字是多少。思路:动手稍微模拟一下就会发现:1.表中一定会有进位。当表中有数字x时,那就一定会有数字x2,x4…一直到出现进位。2.由于第一列和第一行的字符串长度都为1,那么可以的到这个表一定是n-1进制的。还是基于第一点,结合加法表和进位的特点,可以得到:最终一定会出现0到n-1的所有数。所以只需要先找到0,再找到1,就可以推出后面的字母了。#include<bits/stdc++.h>us
2022-03-21 10:50:51
283
原创 P1005 [NOIP2007 提高组] 矩阵取数游戏
传送门题意:给你一个n*m的矩阵,在每一行矩阵的两头单独取数,问最终获得的数的总和的最大值。思路:对于每行单独区间dp,设dp[st][ed]表示st到ed区间的最大值,因为取数只能从两端取,那么dp[st][ed]可以由dp[st][ed-1]*2+a[i][ed]*2和dp[st+1][ed]*2+a[i][st]*2转移得来。#include<bits/stdc++.h>using namespace std;#define ll long long#define end
2022-03-19 18:39:27
4272
原创 D. Yet Another Sorting Problem
传送门题意:给你一个序列,每次操作选择三个下标,使得选择的这三个下标的数以环形互相移动(即1,2,3变为3,1,2),问你经过任意次的操作后,这个序列能不能变为非递减序列。思路:首先考虑序列中是否存在两个相同的数。若存在:那么每两次操作都可以将两个不处于正确位置的数移动到正确位置。若不存在:那么可以证明:每次操作都会让整个序列的逆序对进行偶数次的改变,最终,如果初始序列的逆序对为偶数,则“YES”,否则“NO”。#include<bits/stdc++.h>using name
2022-03-03 17:26:44
343
原创 D. MEX Sequences
传送门题意:给你一个序列,该序列的满足题目所给条件的任意子序列数目是多少,答案对998244353取模。思路:当前的数x只能加入到mex的值为x-1,x,x+1的序列中,因而我们记dp[x][1]为mex的值等于x-1的序列的数目,dp[x][0]为mex的值等于x的值的数目。由此:假设当前要加入的数为x,那么mex为x+1的序列数dp[x+1][0]=dp[x+1][0]*2。而mex为x的序列数dp[x+1][1]=dp[x+1][1]*2+dp[x-1][0]还要注意x对x+1的me
2022-02-22 17:34:03
307
原创 序列。。。
传送门题意:见题面。思路:设f(n)为gcd(x,y)为n的序对的对数,g(n)为gcd(x,y)为n的倍设f(n)为gcd(x,y)为n的序对的对数,g(n)为gcd(x,y)为n的倍设f(n)为gcd(x,y)为n的序对的对数,g(n)为gcd(x,y)为n的倍数的序对的个数,数的序对的个数,数的序对的个数,那么显而易见的:g(n) = ∑n∣if(i)\sum_{n|i}f(i)∑n∣if(i),这个式子反演后得:f(n)=∑n∣imu(i)∗g(i/n)f(n) = \sum_{
2022-02-11 20:15:28
383
原创 华华给月月出题
传送门题意:求题中所给式子的答案。思路:题目唯一的难点在于想到f(x)=xnf(x) = x^nf(x)=xn是一个完全积性函数,下面简单证明一下:设有f(x)=xn,f(y)=yn且x≤n并且y≤n,则:f(x∗y)=(x∗y)n=xn∗yn=f(x)∗f(y)。设有f(x) = x^n,f(y) = y^n且x\leq n 并且 y\leq n,则:f(x*y) = (x*y)^n = x^n*y^n = f(x)*f(y)。设有f(x)=xn,f(y)=yn且x≤n并且y≤n,则:f(x∗
2022-02-11 17:09:09
548
原创 CF D. GCD Table
传送门题意:给你一个n*m的矩阵,第i行j列元素的值为gcd(i,j),现给你一个长度为k的序列,问这个序列是否能和矩阵中某一行连续子串匹配。思路:对于a1a_1a1来说,我们可以列出如下式子:gcd(i,j)=a1gcd(i,j)=a_1gcd(i,j)=a1,由于选取的序列是连续的,又可以列出所有关于a1到aka_1到a_ka1到ak的式子:gcd(i,j)=a1gcd(i,j)=a_1gcd(i,j)=a1gcd(i,j+1)=a2gcd(i,j+1)=a_2gcd(i,j+1
2022-01-24 11:19:50
1399
原创 D. Martial Arts Tournament
传送门题意:给你n个数,构造一组x,y,将这n个数划分为小于等于x,大于等于y以及大于x小于y的数三个区间,我们可以往每个区间添加数,使得每个区间的数为2的幂次,输出添加数的最小个数。思路:设num[x]为1-x中数的个数,我们枚举小于等于x的区间需要添加的2的幂次和大于x且小于y的2的幂次,那么剩下的部分自然就是大于等于y的数字个数,枚举求最小添加数。#include<bits/stdc++.h>using namespace std;#define ll long long
2022-01-17 18:48:22
748
原创 E. Replace the Numbers
传送门题意:执行q次操作,有两个选项:添加一个数或者将当前所有指定的数变为另一个数。思路:我们记录每个数第一次出现的位置,作为“头”,在新添加数的时候,记录每个位置上的数第一次出现的位置,也就是它的“头”。在修改时,只需要合并“头”就行了。#include<bits/stdc++.h>using namespace std;#define ll long long#define endl '\n'int ans[500010];int link[500010];int f
2022-01-10 17:23:36
379
原创 P1052 [NOIP2005 提高组] 过河
传送门题意:青蛙想从0处到达L处,路上有m块石子,问最少踩多少块石子可以过河(可以踩石子之外的地方)。思路:暴力dp比较好想,这样做是O(l),l最大1e9,肯定超时。但这题石头少,可以考虑离散化。离散化方案可以抽象成这样一个问题:有两个数i,i+1,从x开始,每次对x加i或者加(i+1),可以得到哪些数,然后会发现x+i*(i+1)之后的所有数都可以得到,于是我们将两点距离大于i*(i+1)的石子都减去i*(i+1),在这题上面,我们考虑st的做法,若两点距离大于st,则一直减小t倍距离直到两
2022-01-06 11:50:34
691
原创 Alternating Sum
传送门思路:首先可以得出这是一个公比为b/a的等比数列,它的周期为k,因而每两个相邻周期的和的关系为sumi=sumi−1∗(b/a)ksum_i=sum_{i-1}*(b/a)^{k}sumi=sumi−1∗(b/a)k,所以我们可以先求出第一个周期的和,剩下的就是一个等比数列求和即可。#include<bits/stdc++.h>using namespace std;#define ll long long#define endl '\n'const ll mod =
2022-01-03 18:49:52
540
原创 Sum of Consecutive Prime Numbers
传送门题意:给你一个数n,将这个数表示成一段连续素数的和,问你有多少种表示形式。思路:欧拉筛筛出4e7之前的素数,再用双指针维护区间和。#include<bits/stdc++.h>using namespace std;#define ll long longint cnt;int vis[40000010];int pri[10000010];ll sum[10000010];void oula(){ for(int i = 2; i <= 400000
2021-12-30 12:07:46
511
原创 Prime Distance
传送门题意:求区间l到r内差最小和差最大的质数对。思路:根据“若x为合数,则它在区间[2,x][2,\sqrt{x}][2,x]内一定有最小质因数”(也就是欧拉筛的思想),我们可以先筛出[2,2147483647][2,\sqrt{2147483647}][2,2147483647]内的所有质数,再用这些质数去筛出[l,r][l,r][l,r]内的所有合数,这样就可以找到区间内的所有质数。#include<bits/stdc++.h>using namespace std;#
2021-12-28 20:08:44
178
原创 P1495 【模板】中国剩余定理(CRT)/曹冲养猪+中国剩余定理讲解
传送门借此题复习一下中国剩余定理。题意:此题可简化成求同余方程的解(a1...an互质a_1...a_n互质a1...an互质):x mod a1=b1x\ mod\ a_1=b_1x mod a1=b1x mod a2=b2x\ mod\ a_2=b_2x mod a2=b2x mod a3=b3x\ mod\ a_3=b_3x mod a3=b3…x&
2021-12-26 21:22:24
1462
原创 J. Xingqiu‘s Joke
传送门题意:给你两个数a,b,每次可对两个数同时进行三种操作:加1,减1或者同时除以他们的公共质因数,问使得其中任意一个数到达1的最小操作 次数。思路:不妨设a>b,f(a,d)表示a,b-a这组数转化为1的最小次数,d为b-a的值,设k为b-a的质因数,那么f(a,b)是可以由状态f(a/k,b/k)和f(a/k+1,b/k)转化而来,于是,通过dfs的方式求解。#include<bits/stdc++.h>using namespace std;#define ll l
2021-12-25 22:32:26
877
原创 D. Fox And Jumping
传送门题意:给你n张卡片和初始坐标0,每张卡片都有一个lil_ili,每一张卡片可以跳到当前坐标加减lil_ili的位置同时每张卡片有对应的花费,每张卡片选取后可以任意次使用,问你想要跳到任意一个格子的最小花费。思路:首先解决一个问题:选取的卡片要满足何种条件才能够走到所有格子。这个问题不难解决,假设选取的卡片能跳的距离为a1,a2...aka_1,a_2...a_ka1,a2...ak,当前位置为pospospos那么选取的这k个卡片必须要能跳到pos+1或pos-1的位置,这样才能使
2021-12-18 14:01:21
269
原创 stein求gcd
于欧几里得算法的对比与欧几里得求gcd相比,stein算法的优势在于稳定,欧几里得算法中存在取模运算,而当模数过大时,取模运算的耗时会增加,而stein算法中只涉及移位,速度超快!原理gcd(ka,kb)=k*gcd(a,b)实现int stein(int a,int b){ if(a<b)a^=b,b^=a,a^=b;//交换 if(!b)return a; if((!(a&1)) && (!(b&1)))return stein(a>>
2021-12-17 23:46:31
214
原创 A New Function(除法分块)
传送门题意:设f(i)为i除了1和i之外的约数的和,求∑1if(i)\sum_1^if(i)∑1if(i)。思路:对于n来说,1~n中是i的倍数的个数有n/i个,利用这个可以很轻松的计算出约数i的贡献,但枚举每一个约数在时间复杂度上肯定过不去,于是想到除法分块,对于数n的每一个除法分块[li,ri][l_i,r_i][li,ri],n/li−1n/l_i-1n/li−1就为这一段区间中的每一个数的贡献次数(不计算1和本身),用这一段区间的和乘上贡献次数即可得出这段区间的总贡献。#incl
2021-12-14 13:55:13
1237
原创 约数之和。
约数之和题意:求出aba^bab的约数之和。思路:将a分解质因数得a=p1num1∗p2num2∗......pnnumna=p_1^{num1}*p_2^{num2}*......p_n^{numn}a=p1num1∗p2num2∗......pnnumn,那么aba^bab分解质因数就是a=p1num1+b∗p2num2+b∗......pnnumn+ba=p_1^{num1+b}*p_2^{num2+b}*......p_n^{numn+b}a=p1num1+b∗p2num2+b∗
2021-12-14 00:28:22
1004
原创 Codeforces Global Round 17 D. Not Quite Lee(gcd)
传送门题意:给你一个序列a,对于数aia_iai,将其写成任意aia_iai个连续的数,记第aia_iai组数的和为sumisum_isumi,现要你找出所有的sumisum_isumi的组合,使每个组合中的sum的和为0。思路:经过推理,不难发现:对于aia_iai为偶数的情况,它的贡献为ai/2+ai∗ka_i/2+a_i*kai/2+ai∗k,k为任意整数,下同;对于aia_iai为奇数的情况,它的贡献为ai∗ka_i*kai∗k。同时,我们也可以得出第一个重要结论
2021-11-25 20:39:15
417
原创 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)F.Fireworks
传送门题意:每一个烟花爆炸成功的概率为p*0.0001,我们设最优策略为一次性燃放k个烟花,则k个烟火中至少有一个燃放成功的概率为1−(1−p)k1-(1-p)^k1−(1−p)k.#include<bits/stdc++.h>using namespace std;#define endl '\n'#define ll long longll n,m;long double p;long double f(ll x){ return ((long double)x*1.
2021-10-31 12:55:12
303
原创 Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 2) J. Robot Factory
传送门题意:给你一个矩阵,矩阵中的每一个数的二进制串可以表示出该位置周围的围墙信息,让你求出所有的房间大小。思路:建图,搜索,一气呵成。#include<iostream>#include<string>#include<map>#include<bits/stdc++.h>#include<iomanip>#include<algorithm>#define ll long longusing namespa
2021-10-21 21:36:21
411
原创 P1214 [USACO1.4]等差数列 Arithmetic Progressions
传送门题意:给你一个由m限制下的集合,在这个集合中找出所有长度为n的等差数列。思路:暴力+优化。首先可以枚举公差d,d的最大值取m∗m∗2/(n−1)+1m*m*2/(n-1)+1m∗m∗2/(n−1)+1即可,然后以公差d枚举数列的最后一位,判断该位是不是该数列的第n个数。#include<iostream>#include<string>#include<map>#include<iomanip>#include<bits/st
2021-10-21 11:50:57
133
原创 高斯消元。
传送门高斯消元:用模拟的方式来实现对多个方程组的求解。高斯消元可分为两个步骤:化简和回代化简:将方程组组成一个增广矩阵,并将其化为行阶梯矩阵。int Gauss(){ for(int c = 1; c <= n; c++) { int f = c; for(int r = c; r <= n; r++) { if(fabs(a[f][c]) < fabs(a[r][c])) { f = r; } } for(int i = 1;
2021-10-20 12:22:01
159
原创 P1297 [国家集训队]单选错位
传送门题意:有n个题目,每个题目有aia_iai个选项,由题目所给的代码生成序列a,在保证原先答案全部正确的情况下,将第i题的答案抄在了第i+1题上,问你现在做对题目的期望。思路:太离谱了,还以为会卡精度啥的,结果一发就过了,让我对数据产生了怀疑。看第i题的选项数aia_iai,因为目前aia_iai处的答案来自于ai−1a_{i-1}ai−1,如果ai−1≤aia_i{-1}\leq a_iai−1≤ai,即现在在小于aia_iai的数中随机选一个数,而这个数成为正确答案的概率为
2021-10-15 23:17:43
80
原创 P1004 [NOIP2000 提高组] 方格取数
传送门题意:给你一个n∗nn*nn∗n的矩阵,问你先后两次从左上角走到右下角,途中获取对应值,最多获得的值是多少。思路:类似于只走一次从左上角走到右下角的题,这题只需要枚举两个点在不同位置的最大值进行递推即可。用dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l]表示走到(i,j)和(k,l)(i,j)和(k,l)(i,j)和(k,l)时的最大值。#include<bits/stdc++.h>#define ll long longusing na
2021-10-14 22:57:07
173
原创 Codeforces Round #748 (Div. 3)A,B,C,D1,E题解
A. Elections传送门题意:给你a,b,c三个数,问你让这三个数每一个都严格大于其它俩数的最小花费。思路:分别对a,b,c进行判断即可。#include<bits/stdc++.h>#define ll long longusing namespace std;#define eps 0.00000001int main(){ int t; cin>>t; while(t--) { ll a,b,c; cin>>a>
2021-10-14 01:00:33
313
原创 Educational Codeforces Round 115 (Rated for Div. 2) D. Training Session
传送门题意:给你n个题,每个题都有一个主题和一个难度,输入保证同一个主题下不会有相同难度的题出现,现选择三个题组成一个题集,问你满足以下至少一个条件的选择有多少种:1.所选择的三个题目主题互不相同。2.所选择的三个题难度互不相同。思路:直接算出所有方案数的难度过大,于是走反面,用总的选择数-非法的选择数。对于此题的输入,我们可以建立邻接矩阵,并将每一种难度的题的数目装入桶中。遍历所有的问题,对于问题a(i,j)a(i,j)a(i,j),i表示主题,j表示难度,一定包含问题a的非法组合的数目为:
2021-10-12 22:30:58
154
原创 P1072 [NOIP2009 提高组] Hankson 的趣味题
传送门题意:给你a0,a1,b0,b1,问你gcd(x,a0)=a1,lcm(x,b0)=b1,有多少个x满足条件gcd(x,a0)=a1,lcm(x,b0)=b1,有多少个x满足条件gcd(x,a0)=a1,lcm(x,b0)=b1,有多少个x满足条件。思路:先看gcd(x,a0)=a1gcd(x,a0)=a1gcd(x,a0)=a1这个式子,x可以被拆分为数个质数,a0同理,那么它俩的gcd就应该为公共质因数的乘积,也就是说x/a1x/a1x/a1和a0/a1a0/a1a0/a1没有公共质因数
2021-09-28 15:27:27
132
原创 P1069 [NOIP2009 普及组] 细胞分裂
传送门题意:给你m1,m2,现在有M=m1m2M = m1^{m2}M=m1m2个试管,n种细胞,每种细胞经过1s可以分裂成aia^iai个细胞,问你可以将细胞平均分配到M个试管的最短时间。思路:先得出m1的质因数集合s1以及这些m1中这些质因数的个数,可以想到:如果i细胞可以在有限的时间内得到合适的数量使其可以分配到M个试管中去,那么i细胞每次分裂的个数ai,它的质因数集合设为s2,则s1一定包含于s2。于是,s2集合里的质因数每秒加1,而s1里的每种质因数的个数应该还需要乘上m2,最后我们只
2021-09-26 11:50:04
467
原创 Codeforces Round #743 (Div. 2) B. Swaps
传送门思路:遍历b数组,找到a数组中小于bib_ibi的下标最小的数。#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<map>#include<queue>#include<math.h>#include<vector>using namespace std;#define
2021-09-20 22:33:59
217
原创 P4447 [AHOI2018初中组]分组
传送门题意:给定一个序列,要给这些序列分组,要求组内的值连续且不重复,问元素个数最少的组的元素个数最大值。思路:可以先将连续的数字看成一组,在这些连续数字中,由小到大判断每一个值的个数,对于相邻两个数来说,如果较大值的个数比较小值得个数多,那么较大值就可以让自己的全部值参与划分并且还有剩余,但如果较大值的个数比较小值小,那么划分就可以到此结束了,若是较大值参与划分,它便不会有剩余,这就可能导致后面的值无法分配,从而使得答案较小。#include<bits/stdc++.h>usin
2021-09-18 15:56:37
272
原创 P1621 集合
传送门思路:先将质数筛出来,再用筛出的质数去筛a到b的数,并将其加入到并查集中。#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<map>#include<queue>#include<math.h>#include<vector>using namespace std;#de
2021-09-17 21:56:59
88
原创 Codeforces Round #730 (Div. 2) D1. RPD and Rap Sheet (Easy Version)
传送门思路:假设0到n-1之间的数为密码,则可以想到一个可行的解法:第一次输出0,之后的每一次都输出(i−1)⊕(i−2)(i-1)⊕(i-2)(i−1)⊕(i−2)。假设答案为x,那么第一次输出0,答案变为0⊕x;第二次输出0⊕1,那么答案就变为0⊕x⊕0⊕1,即x⊕1;第三次变为x⊕2…以上利用异或的性质,可以在n次询问中获得答案。#include<bits/stdc++.h>#include<ctime>using namespace std;#def
2021-09-11 20:03:29
110
原创 Educational Codeforces Round 113 (Rated for Div. 2) C. Jury Meeting
传送门题意:给你一个序列,每次从头到尾每一次让不为0的值减1,执行数次直到序列中所有数为0,问你满足序列中不会出现同一个数连续减两次的排列的种数。思路:易得:当序列中至少有一个最大数在所有比它小1的数的右边,那么该序列不满足条件,为了方便,考虑反面,用整个序列全排列的个数减去反面的个数。考虑反面:当一个最大数在第n位时,这种情况的个数为:An−1n−1∗A最大数个数最大数个数∗A比最大数小一的数的个数比最大数个数小一的数的个数A_{n-1}^{n-1}*A_{最大数个数}^{最大数个数}*A_{
2021-09-10 00:17:59
85
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人