06 2021 档案
摘要:原题链接 考察:构造 思路: 可以发现(i,i)点彼此距离为sqrt(2).我们构造彼此距离差1的点即可 ##Code #include <iostream> #include <cstring> using namespace std; int n,m; int main() { while(sc
阅读全文
摘要:原题链接 考察:思维 过了这题的有1w+,本蒟蒻直接去死算了() 思路: 假设排序后$a[0],a[1],a[2]$ 分两种情况: \(a[2]>=2(a[0]+a[1])\),此时答案为$a[0]+a[1]$ \(a[2] < 2(a[0]+a[1])\),此时不断取a[2] 2个,a[1]取一个
阅读全文
摘要:原题链接 考察:线性dp(状态机dp?) 错误思路: 对于每个数字按出现次数sz与值val的乘积排序,假设第一个值为x,$x*sz[x]>(x-1)*sz[x-1]\(但这并不表明\)(x-1)*sz[x-1]+(x+1)sz[x+1]会<xsz[x]$.所以贪心是不可取的. 正确思路: 选择没有规
阅读全文
摘要:原题链接 考察:贪心+二分 错误思路: 对于每个折扣能买就买. 正确思路: 直接求最小天数是不好求的,先二分确定天数,然后判断此天数是否能买完.用while和优先队列模拟每天干什么,对于每个折扣,最优解是在给定天数范围内,买折扣物品的天数能晚则晚,将钱留给其他物品. ##Code #include
阅读全文
摘要:原题链接 考察:贪心+思维 思路: 易知 反序和<=乱序和<=正序和.但是这道题是求$f[l,r]$的累加和.我们可以发现由于a是固定的,每个$a[i]$对res的贡献次数也是固定的:即$i*(n-i+1)\(,也就是求\)\sum_1^n a[i]*b[i]i(n-i+1)$,因为对于$a[i]$
阅读全文
摘要:原题链接 考察:思维 错误思路: 每个数求lcm,检查lcm的因子是否在d数组内. TLE 思路: 如果存在的话,最后答案一定是res = d[n]*d[1](排序后),我们检查res的因子,最后比较个数即可(一定要比个数). ##Code #include <iostream> #include
阅读全文
摘要:原题链接 考察:贪心 思路: 原本的思路是根据给定1的的数量确定0数量的范围.假定当前1的数量为n,那么0的数量m的范围是 \(\frac{n-1}{2}<=m<=n{\quad} (n>=0)\).根据范围是否合法进行两种操作: \(res+="110"\) \(res+="10"\) 但是这都是
阅读全文
摘要:原题链接 考察:线段树 or RMQ + 离散化 错误思路: 对于查询中,没给出降雨量的年份,假定降雨量为0,再建立线段树. 错误原因: maybe的依据是区间最小值为0,但是即使有不确定的年份也可以确定false,而且插入虚点了就不方便判定中间值与$l,r$的大小情况. 正确思路: 对于每个查询,
阅读全文
摘要:原题链接 考察:数论+状压dp 思路: 很明显要选$gcd(L_i) = 1$,且成本和最小的卡片.如果用背包dp会MLE.从单个考虑,枚举一个$L_i$,它的质因数总数不超过9个.这里就可以用状压dp,枚举其他$L_i$,如果不能整除质因子$p$,就在那一位赋1,最后取最小值即可. ##Code
阅读全文
摘要:原题链接 考察:拓扑排序 思路: 不难,暴力建边+拓扑排序,impossible条件是出现环或者,比较长度时,长的排在短的前面. ##Code #include <iostream> #include <cstring> #include <algorithm> #include <queue> u
阅读全文
摘要:原题链接 考察:线段树 or 思维+RMQ ####思路一: 用线段树解法比较容易理解.$cnt$记录$[l,r]$区间的最大次数.它可以由子区间的cnt推来,如果左子区间的右端点 = 右子区间的左端点,那么也可以由左子区间的右连续最大长度+右子区间左连续最大长度推来. 需要注意的是查询和push_
阅读全文
摘要:原题链接 考察:双指针 错误思路: 贪心,对于当前枚举$a[i]$,要么把它加入到当前和里,要么新开一个和. 错误原因: 只能说当前差值大不代表以后小. 正确思路: 双指针法用于解决有单调性的区间问题.这里找到区间和的绝对值最靠近t的点.因为数列是有+-的,所以前缀和没有单调性,但是这里求的是绝对值
阅读全文
摘要:原题链接 考察:计数dp 思路: 这dp真心还算好想,可本蒟蒻是fw.令$f[i]$为首项为$a[i],长度为a[i]+1的个数$ (1) a[1] = k-1的幸运序列.\(f[i] = C_{n-i}^{a[i]}\) (2) 拼凑的序列,这里不是区间dp,我们考虑一个幸运序列至少可以拆成俩个序
阅读全文
摘要:原题链接 考察:思维 思路: 比较容易想到离散化,然后让L点权值为1,R点权值为-1.这里需要分类讨论: (1) 当前枚举点有左端点,此时再计算上个点到此点的距离,\(ans[当前权值和] = v[now] - v[last]\) (2) 当前枚举到有右端点,此时$ans[当前权值和] = v[no
阅读全文
摘要:原题链接 考察:线段树+最短路 思路: 线段树优化建边的模板题,基本参考了大佬博客,私以为这个是讲得最好的. GO 关于为什么出树是由子到父,因为入树必然是父节点到子节点,而为了搭配入树只能是子节点到父节点. ##Code #include <iostream> #include <cstring>
阅读全文
摘要:原题链接 考察:二分 错误思路: 分治.将第一个数和其他所有数比较完后,确定第一个数的位置.然后递归左右半边. 只过了10个数据,剩下的超过10000次. 思路: vector装已经排好的序列,对于新的枚举数,二分求适合它的位置. ##Code // Forward declaration of c
阅读全文
摘要:原题链接 考察:最短路 思路: 建边是容易想到的...但是本蒟蒻没反应过来怎么求会面点... 建虚点,以1,n为起点求到达每个点的距离,然后每个点距离的最大值的最小值就是答案. ##Code #include <iostream> #include <cstring> #include <queue
阅读全文
摘要:原题链接 考察:分治 经典题了,问题是这种分治本蒟蒻真的想不到() 思路: 思路以及证明看这位大佬的博客,没有比他写的更好的. GO 但是这位大佬的图感觉有点问题,后面枚举y坐标时,日字应该是横着才对. 时间复杂度$O(nlog_2n)$ ##Code #include <iostream> #in
阅读全文
摘要:原题链接 考察:分治 思路: 我是sb,普及题不会().发现只要不是2两端就需要(),由此区别开. ##Code #include <iostream> #include <algorithm> using namespace std; const int N = 20; int logs[N],n
阅读全文
摘要:原题链接 考察:分治 令人呕吐的分治 思路: 直观思路是找到A,B的直角坐标,然后求距离和.这里的分治是递归到最底层,然后根据等级i到等级i+1的坐标变化,算出直角坐标.可以发现将图分为4个模块时,每个等级的变换规则相同. ##Code #include <iostream> #include <c
阅读全文
摘要:原题链接 考察:拓扑排序+并查集 错误思路: 离线处理,$d[i]$记录i的入度.如果$d[i]<=1$就不纳入并查集,否则就加入. 错误原因: 删除一个点,可能使别的点$d[i]<=1$ 思路: 因为$d[i]$是会级联影响的,所以我们用拓扑排序求$d[i]<=1$的点.但是注意题目是无向边,我们
阅读全文
摘要:原题链接 考察:莫比乌斯反演 思路: 参考的大佬的题解.这位老师总结的套路总结的很好:GO 主要为: 优先提取gcd(i,j) 将$gcd(i,j) = d$化为 \(gcd(i/d,j/d) = 1\) \(\sum_{d|gcd(i,j)}^{gcd(i,j)} mob[i] = [gcd(i,
阅读全文
摘要:原题链接 考察:推公式 思路: \(gcd(lcm(a,b),lcm(a,c))==gcd(a,lcm(b,c))\) ##Code #include <iostream> #include <cstring> using namespace std; typedef long long LL; c
阅读全文
摘要:原题链接 考察:思维 思路: 从小区间开始看: len==2,只有区间:k >k各一个,才能成功.只要出现了2个k,那么在len==3的区间内一定能成功.此时递推出yes. len==3,不考虑(k,>k)的区间长度=2的情况,假设区间内存在k,那么此时只有(<k,k,k)或者(k,<k,>k),(
阅读全文
摘要:原题链接 考察:树状数组 错误思路: 按顺序加入线段,对于每个线段左右端点,求min(左端点往上的个数,右端点往下的个数),min(左端点往下的个数,右端点往上的个数) 错误原因: 当数据出现: 1 1 3 3 2 2 就会计算错误. 思路: 排序,按左端点排序,求右端点的逆序对. ##Code #
阅读全文
摘要:原题链接 考察:贪心 错误思路: 对于每个任务,按d,a顺序排序,如果不能按时完成就付钱使得按时完成. 思路: 不一定要压当前任务的时间,我们可以压花费更小的任务时间,使得超时任务按时完成. ##Code #include <iostream> #include <cstring> #include
阅读全文
摘要:原题链接 考察:数位dp+高精 思路: 数位dp太裸了,所以考察的是高精,参考大佬写了压位的高精,以后可以拿出来%. 转移的第三重循环不要从0~M,而是枚举这一位数字是什么. ##Code #include <iostream> #include <cstring> #include <algori
阅读全文
摘要:原题链接 考察:容斥原理 or 莫比乌斯反演 思路: 枚举平方数: \(2^2,3^2,4^2,5^2,6^2,...,1e^{7^2}\) 对于$22$需要减去,$32$需要减去,$42$不需要计入,$62$需要减去...如果忽视指数,这就对应了莫比乌斯函数,我们预处理1e7以内的质数,然后利用$
阅读全文
摘要:原题链接 考察:容斥原理 只有我不会的容斥原理. 错误思路: 正向考虑,然后根本算不出来 思路: 这里主要是抽象成四个条件: 第一行没有人 最后一行没有人. 第一列没有人 最后一列没有人. 我想的是分情况讨论边角的情况,结果是情况太复杂了.这里的容斥主要是抽象出四个条件. 而且处理剩余位置也很妙,每
阅读全文
摘要:原题链接 考察:莫比乌斯反演 思路: 发现gcd(i,j) = 1的损失能量都是1,gcd(i,j) = 2的,损失能量都是3...由此枚举gcd(i,j) = k,求$(n,m)$范围内$gcd(i,j) = k$的对数.时间复杂度大概是$O(n^{3/2})$ ##Code #include <
阅读全文
摘要:原题链接 考察:容斥原理+组合数学 错误思路: 想得有点复杂,考虑未修改a数组的gcd的值,然后修改后的gcd的值,这么想完全没得思路. 正确思路: 假定当前$gcd(b_1,b_2,b_3,...,b_n) = d$,a数组有$cnt$个$d$的倍数. \(n-cnt>k,ans = 0\) \(
阅读全文
摘要:原题链接 考察:莫比乌斯反演 菜狗不会啊QAQ 思路: 参考了大佬的题解,我们列出求答案的式子. \(\sum_{k=1}^{min(n,m)}[f[k]<=p]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==k]\) 注意:f[k]为k的质因子个数. \(\sum_{k=1}
阅读全文
摘要:原题链接 考察:容斥原理 思路: xOz,yOz,xOy三个面就是当作二维面计算,每次计算*3即可.三维也是利用莫比乌斯函数计算,即容斥原理. ##Code #include <iostream> #include <cstring> using namespace std; typedef lon
阅读全文
摘要:原题链接 考察:容斥原理(二项式反演) 思路: 根据题意,定义$g[i]$为使用颜色不超过i种的方案数,这个比较好求,但是$f[i]$恰好为i个就比较难求. 但我们可以发现: \(g[i] = C_i^0 f[0]+C_i^1 f[1] + C_i^2 f[2]+...+C_i^i f[i]\) 这
阅读全文
摘要:原题链接 考察:构造 参考官方题解的思路: 假定原序列是从小到大排序的: \(a:1,2,3,4,5\) 将原序列左移或者右移一位,就可以使得子序列的和不同. \(b:2,3,4,5,1\) 证明: (1) 不考虑原序列最大的数,其他位上的每一位数都是$a[i]<b[i]$,如果$S$内没用原序列最
阅读全文
摘要:原题链接 考察:思维+枚举 思路: 思路应该比较好想,只要存在互质的两对,答案就是数组长度-数组中1的个数.如果不存在,答案就是最短连续子段gcd = 1的长度*2+其他元素个数. 我写的时候认为最短一定是3,实际不是,看下面测试数据: 6 120 120 5 30 15 6 ans = 8. gc
阅读全文
摘要:原题链接 考察:抽屉原理+思维 思路: 一共n个数,如果存在%n==0的数,那么直接输出.如果不存在,余数在1~n-1之间有n个数.根据抽屉原理,必然存在两个余数相等的数(但不一定存在两个相加==n的数).余数相等有什么用呢?说明(r-l)%n == 0.这里就可以用前缀和求解. ##Code #i
阅读全文
摘要:原题链接 考察:思维 思路: 神仙题.想了半天还以为和一元二次方程的$b2-4ac$有关系,结果没多大关系(.),或者可能是本蒟蒻没想到 一般是将两个未知量划到左右两边个一边,枚举其中一个来确定方案数. \(y^2-x^2 = ax+b\) \(y^2 = x^2+ax+b\) \(4y^2 = 4
阅读全文
摘要:原题链接 考察:组合数学 直接给我梦回高中排列组合,考的是插空法,我完全没印象.... 思路: 先排列m个树苗,方法是$m!$,接下来先将空插到树苗中间,此时还剩下$n-2m+1$个空位,这$n-2m+1$个空位分为m+1组,这里可以用隔板法求解,求组合数我求麻烦了点,可以直接求. ##Code #
阅读全文
摘要:原题链接 考察:容斥原理 思路: 这个容斥思路应该很经典了,硬币购物也是这个思路. 如果不考虑限制,方法数就是隔板法求解:\(C_{n+m-1}^{n-1}\),但是有限制的情况下就不能这么求解. 直接求不好做,考虑求补集.至少不满足一个条件的情况,至少不满足两个条件的情况容斥即可.但是至少不满足一
阅读全文
摘要:原题链接 考察:组合计数 思路: 有两种推到最后$C_{r+l+k}^k$的方法.主要思想就是构造严格单调递增的序列. 方法一: \(L<=a_1<=a_2<=a_3<=...<=a_k<=R\) 如果直接求的话,需要讨论用几个数填满k个位置,这就是相当于隔板法.但是k范围太大,难以预处理此方法不可
阅读全文
摘要:原题链接 考察:组合数学+gcd 思路: 不考虑共线情况,总的方案数是$C_{n+m}^3$,考虑共线的话,直接求共线的方案数比不共线好求.那么我们就利用容斥原理即可. 对于共线的三个点,如果确定了起点和终点,中间点的取法就是gcd(长,宽)-1.对于共线,我们以长宽分类,求当前长i,宽j的三角形个
阅读全文
摘要:原题链接 考察:组合数 思路: 类似高中数学排列组合题....我是fw,还以为是dp,结果就是简单的求组合数....分为放在b,d两类. 排列数这里用的递推方式,所以没用乘法逆元. ##Code #include <iostream> #include <cstring> using namespa
阅读全文
摘要:原题链接 考察:计数dp 思路: 隔板法的模板题,适用于求n个苹果分给k个盘子,且每个盘子不为0的排列数. 实际是求$C_^$.需要高精 ##Code #include <iostream> #include <cstring> using namespace std; typedef long l
阅读全文
摘要:原题链接 考察:计数dp 思路: 虽然之前接触过计数dp,但是碰到这种题第一反应除了组合数之外毫无想法,今天学计数dp才发现不止组合数这一知识点. 有两种方法.以不同的划分状态依据. 方法一: 定义 f[i] 为i头牛并排站的方案数.以最后一头牛是什么品种来划分.如果最后一头牛为A牛,则剩下的i-1
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 想了dp转移方程,看了题解发现没有这么复杂,利用邻接矩阵的性质就行了,参考Floyd算法,外层每循环一次,相当于经过了一条边,也是转移到了一个新的状态. 把停留看成自环,城市之间的道路就等同于邻接矩阵的原本意义,但是爆炸就比较难处理.大佬的思路是建立虚点,该点只有
阅读全文
摘要:原题链接 考察:前缀和+二分 错误思路: 求每个$kk$矩阵的最大值,没想出来,还以为是dp 思路: 将最大值问题转换为个数问题,求在ans时间内,$kk$矩阵和 = k*k是否为true.这里二分+前缀和(树状数组)解决. 时间复杂度O(\(n*m*log_2 q\)) ##Code #inclu
阅读全文
摘要:原题链接 考察:枚举,前缀和 和本题的正解思路有点像的 >Go 题意: 在数组中放三个间断点,使得res最大. 思路: 三个间断点求最值,不能是在前缀区间只取正数,后缀区间只取负数,存在隔了负数出现大正数的情况. 可以枚举中间点mid,求[1,mid]的最大前缀,[mid,n]的最小后缀,两个for
阅读全文
摘要:原题链接 考察:线性dp or 枚举 大佬的思路: 0不能出现在1的右边,所以是单调非下降子序列,求最长即可. 本菜狗的思路: 枚举每一个1的位置,求保留前面所有0和后面所有1的长度,取最长即可. ##Code #include <iostream> #include <cstring> #incl
阅读全文
摘要:原题链接 考察:贪心+枚举 WA了n次,正解思维其实和A题一样,我想出了A题却没反应过本题,果然还是菜. 错误思路: 分两种方式,一个是从时间少做到时间多的,另一个是横向完成一组一组的子任务. 错误原因: 很明显没有枚举所有方式. 正确思路: 枚举做0~n组任务后,再从小到大做任务的耗费时间. ##
阅读全文
摘要:原题链接 考察:矩阵快速幂 错误思路: 想着取对数,然后半天做不出来() 正确思路: 随着f[i]的i变大,a,b的指数是斐波那契数列,再用欧拉降幂+快速幂即可. ##Code #include <iostream> #include <cstring> using namespace std; t
阅读全文
摘要:原题链接 考察:矩阵快速幂 不是人可以想出来的思路.... 思路: 当$i^k$的$i$很大,$k$又很小时,可以考虑二项式展开. \(S_{i+1} = S_{i} +A_{i+1}\) \(A_{i+1} = (i+1)^k \times f_{i+1}\) 然后将$(i+1)^k$进行二进制拆
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 将有理项和无理项分开,可以发现两者的系数都有规律.参考了这位大佬的博客,这波我没想出来().对$\sqrt b$的系数取模是不合理的,所以只能另寻他路. ##Code #include <iostream> #include <cstring> #include
阅读全文
摘要:原题链接 想到了按位计算,然后就没有然后了(.) 思路: 以样例2为例,ans = 2是因为(i,j)和在第二位上为1的序对有奇数个,那么怎么计算奇数个呢?(本蒟蒻卡这了).能够影响第i位的和是否为1的只有1~i位的数字,我们对每个a[i]%2i = b[i],对于每个b[i],我们需要找到与它的和
阅读全文
摘要:原题链接 考察:矩阵快速幂 两种方法,但我都没想到() 思路一: \[ \left[ \begin{matrix} A & E \\ 0 & E \\ \end{matrix} \right]* \left[ \begin{matrix} A & E \\ 0 & E \\ \end{matrix}
阅读全文
摘要:原题链接 考察:博弈论 又到了我最喜欢的死活推不出规律的环节(. 思路: 对于n个石子堆,假定堆最大值为maxn,和为sum,如果maxn>sum-maxn那么先手必胜(先手一直取maxn堆即可). 但是如果maxn<=sum-maxn,选手就需要避免出现操作后maxn>sum-maxn的情况,此时
阅读全文
摘要:原题链接 考察:构造 思路: 对于n,如果每次x都能+-(n-1)的倍数,那么一定可以使x变成n的倍数. \(x = n*x-(n-1)*x\) \(x+(n-1)x = n*x\) 由此这三步为: 使a[1~n-1]变为n的倍数 使a[n]变成0 使a[1~n]变成0 ##Code #includ
阅读全文
摘要:原题链接 考察:矩阵快速幂+线性dp 思路: 这个dp定义完全不敢往那方面想(),定义f[i][j]为分数为i,最后一位为j的方案数. i==0 f[0][1~base] = 1; 显然 f[1][j] += f[0][k] j与k的差的平方=1 以此类推,但是当i>(base-1)*(base-1
阅读全文
摘要:原题链接 考察:矩阵快速幂 fw本f,想到了把f[i-1]拆开,但没想到只拆一个啊!!! 思路: \(f[i] = 2 \times f[i-1]+1\qquad(i为奇数)\) \(f[i] = f[i-1] + 2 \times f[i-2] +1\) \(f[i] = 2 \times f[i
阅读全文
摘要:原题链接 考察:贪心 本蒟蒻想的是线性dp,时间复杂度太高否了(.),然后又想不到正解. 思路: 参考了大佬的题解,就结果而言,最后要么是**?序列**0,1两极分布,要么是0,1混合分布. 对于混合分布,对于每一个相邻的?,要么是0,1要么是1,0.假设两个相邻?之间有s0个0,s1个1. 如果首
阅读全文
摘要:原题链接 考察:思维+并查集 思路: 对于每个棋子(x,y)我们尽可能把它们移到(x,x)或(y,y).我们尝试将(x,y)与(x,x),(y,y)连线.可以发现有些点成环了,并且成环的点破环环需要一步,破坏环后移回主对角线处又需要一步,其他点在破坏环后移到主对角线都只需要一步. 由此得出需要得到环
阅读全文
摘要:原题链接 考察:Trie+dfs 思路: 将每个数插入Trie中,可以发现如果子树的结点>=2,那么这些结点会内部连接,也就是说:如果左子树和右子树的结点都>=2,那么它们就是割裂的,我们需要删除一些点使得它们连接. 最少删除数 = 最大保留数.对于当前树u, 最大保留数 :f[u] =max(f[
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 就是密码设计那题的矩阵快速幂版.下面是密码设计的递推代码. for(int i=1;i<=n;i++)//已经构造了i个字符. for(int j=0;j<len;j++)//j是已经子串匹配了的位置 for(char k='a';k<='z';k++)//枚举密
阅读全文
摘要:原题链接 考察:线性DP 错误思路: 求出最长公共子序列再dfs回溯枚举长度. 错误原因: 不一定只存在一个最长公共子序列.比如样例2. 正确思路: 是dp(...),定义 f[i][j] 为以1~i,1~j构成的最长公共子序列的最大S值,且A子串以i结尾,b子串由j结尾.这里其实类似最大连续子段和
阅读全文
摘要:原题链接 考察:拓扑排序 思路: 等级低与等级高之间建立边.比如区间[1,6]之间停靠了(1,3,5,6).那么在(1,3,5,6)与(2,4)之间两两间加一条边.最后拓扑排序即可. 但是这样会TLE.时间复杂度O(109),空间复杂度极限O(500*500*1000).需要进一步优化. 但是注意初
阅读全文
摘要:原题链接 考察:拓扑排序 思路: 求拓扑序列,然后从尾到头遍历每个点能到达的点,ans[u] |= ans[子结点1]|ans[子节点2]|ans[子节点3]... 因为需要用到或操作所以考虑位运算,如果每位每位或运算时间复杂度是O(nm),只能用bitset优化,bitset底部用int实现,将n
阅读全文
摘要:原题链接 考察:线性dp 思路: 二分求最长上升子序列板子题,我们可以发现二分求得的最长上升队列中,保存的就是当前长度最小的数字,因此我们只需要每覆盖一个存储它们前面一个,最后递归输出. ##Code #include <iostream> #include <cstring> #include <
阅读全文
摘要:原题链接 考察:线性dp 思路: 其实递推方程超简单,只是我蠢. if(s[i]>s[j]) dp[i]+=dp[j] else if(s[i]==s[j]) dp[i]-=dp[j]; 如果s[i]==s[j],那么dp[i]从前面<s[i]获得的子序列都要减去,因为与s[j]构成了重复. ##C
阅读全文
摘要:原题链接 考察:二分+思维 思路: 杨辉三角有一半重复,所以我们只需要看一半.可以发现每条红线遍历处都是由内向外递增,中间红线是${i \choose 2i}\(,是每一个斜线的开头.n一定在某一条斜线上,我们可以枚举斜线再二分找位置.这里斜线最多16条(\){17 \choose 34}>10^9
阅读全文
摘要:原题链接 考察:背包dp yxc:没做出来本题的反思自己有没有认真听基础课 我:菜狗不配() 思路: dfs写的,当时觉得铁TLE,但是没有想到别的做法(.) f[i][j]表示前i个物品重量为j是否能实现. dp方程: f[i][j] = f[i-1][j] f[i][j] = f[i-1][j+
阅读全文
摘要:原题链接 考察:费马小定理 思路: 指数对1000000007-1取余,模板题我WA了n次. 讲讲坑点:开long long,N>=1不代表指数-1一定>=0,存在%(M-1)-1<0的情况 ##Code #include <iostream> #include <cstring> using na
阅读全文
摘要:原题链接 考察:欧拉定理 思路: 已知每个8888...888都可以被表示成: \(nums = \frac {8\times(10^x-1)}{9}\) $$ nums \equiv 0 \pmod L$$ $$ (10^x-1)% \frac{9\times L}{gcd(8,L)}==0$$
阅读全文
摘要:原题链接 考察:思维 思路: 每个操作都与c无关,且只+-2个a,b.也就是说这是不改变a,b个数的奇偶性的.因此操作与c无关,所以将每个c分割看成一段,比较奇偶性. 本蒟蒻是纯暴力打法,比较简单的代码就是利用异或了. ##Code #include <iostream> #include <cst
阅读全文
摘要:原题链接 考察:贪心+思维 思路: 说是D题,思路比C题明显,很明显经过次数最多的边赋最大的值,虽然是构造但思路非常明显. 难点是怎么计算经过每条边的次数(本蒟蒻就卡这了菜是原罪),经过查看题解观察可得对于一条边(u,v),有sz[v](v点以及v的子节点)个点会经过v到达u或者u以上的点,两两配对
阅读全文
摘要:原题链接 考察:思维 这题也是sb,分析出了只要有存在路径使得所有gcd(x,y)==min的可达,就可以任意交换,然后思路岔到欧拉函数去了(.) 思路: 如上文,任何min的倍数与min gcd都 = min,所以min可以使得倍数之间任意交换.我们检查每个数,如果不是倍数且不在应该的位置上就"N
阅读全文
摘要:原题链接 考察:贪心(?) 我是sb,A题想半天还是错的(.) 思路: \(x_b-(x_a-x_b) = k\) \(2*x_b-x_a = k\) 由此发现只要k+xa%2==1就需要移动.此时xa可以通过左移右移来使k+xa为偶数. 从这里开始根本不需要解不等式!直接讨论$x_a$与k: \(
阅读全文
摘要:原题链接 考察:约数 推到一点感觉完全没规律就没继续了,没想到操作如此之骚... 思路: \(\frac 1x+\frac1y=\frac1{n!}\) \(\frac {x+y}{xy}=\frac1{n!}\) 因为有两个变量,而我们用控制变量法才好求个数,因此我们最好用x(y)表示y(x).
阅读全文
摘要:原题链接 考察:约数 这题很久以前做过一次,但我没写博客,结果再来一次我还是不会(.) 错误思路: 倍数法求每个a[i]的倍数,基本代码如下: for(int i=1;i<=n;i++) { scanf("%d",&a[i]); for(int j=1;j<=M/a[i];j++) sum[j*a[
阅读全文
摘要:原题链接 考察:数位dp 思路: 求回文数字的个数. dfs参数: 1.pos 枚举到第几位 2.len 回文数的长度. 其实不需要变量记录是否合法,不合法的不取搜就行了. ##Code #include <iostream> #include <cstring> using namespace s
阅读全文