- 博客(545)
- 收藏
- 关注
原创 牛牛小数点 (欧拉定理)
Link题意:思路:f(i)结论就是如果i只含有2和5,那么就是0否则是max(mc(2),mc(5))+1max(mc(2),mc(5))+1max(mc(2),mc(5))+1,mcmcmc代表i的幂次,为什么呢,下面粗略的证明一下假设当前循环节长度为n,然后是从第一位开始的形如$$\frac{1}{i}=0. { k } {k } {k }…,那么我们假设\frac {1}{i}=0. { k } {k } {k }…1\两边同时乘以10{n}也就是10n*\frac {1}{i}={
2021-10-01 18:15:23
279
原创 Monotonic Matrix (LGV)
题意:给定n,m,求如下满足定义,是矩阵并且取值只有0,1,2三种,行递增,列递增的方案数(mod 1e9+7)思路:如图,左上为0,中间为1,右下为2,也就是从0,0到n,m的类不相交路径个数,为什么是类不相交呢,因为是非严格不相交,蹭到边上的方案是可以的,刚学完LGV,能不能LGV处理呢,很可惜LGV只能处理不相交的路径个数,那么我们采用扩充点,把0,0映射到1,-1,把n,m映射到n+1,m-1,然后套LGV就行了,为什么呢?可以发现0,0到n,m的路径我们都是可以通过镜像来变成1,-1到n+
2021-10-01 17:00:24
369
原创 CF1305E Kuroni and the Score Distribution(构造)
Link题意:思路:先构造1,n直到溢出了位置,然后考虑加n,如果单纯加n,那么对于前面贡献是n2\frac{n}{2}2n,然后发现n每隔2个数对前面的贡献都会减1,感性的理解,就是,之前n和一个值能匹配x,现在x变大了,n怎么匹配也匹配不了了,那么暴力加n知道刚好能满足m就行了,然后最妙的就是如何处理剩下的数,要造成0贡献,不如隔开构造,也就是说当前的最大值是max,前面有n个数,我们可以构造1e9-n*(maxv+1),1e9-(n-1)*(maxv+1)…代码://#pragma GC
2021-10-01 16:48:45
295
原创 CF1305F Kuroni and the Punishment (随机化)
Link题意:思路:Jiangly都没做出来的题,原来这么操蛋,首先我们要发现一个性质,我们最多操作n次可以使得gcd>1,把ai变成偶数,所有ans<=n,然后可以有个更牛逼的性质,被操作两次及以上的数,不超过⌊n/2⌋\lfloor n/2 \rfloor⌊n/2⌋个,也就是说我们有大于⌊n/2⌋\lfloor n/2 \rfloor⌊n/2⌋个数仅仅只操作一次或者不操作,那么也就是会有大于1/2的概率gcd的质因子会出现在里面,然后只要我们多选几个数,这个概率就会惊人的高,假设选了
2021-10-01 16:42:13
253
原创 LGV引理
Link假设起点集为SSS,顶点集为TTT,求矩阵中S到T的不相交路径的方案数。结论:LGV说白了就是解行列式的值,e(ai,bi)e(ai,bi)e(ai,bi)代表方格中ai到bi的走法,由于小学数学问题显然可以用组合数知道e(ai,bi)=C(a到b的总步数,a到b行走的数量)e(ai,bi)=C(a到b的总步数,a到b行走的数量)e(ai,bi)=C(a到b的总步数,a到b行走的数量)[e(a1,b1)e(a1,b2)e(a1,b3)e(a2,b1)e(a2,b2)e(a2,b3)e(a3
2021-10-01 16:32:00
931
原创 高斯消元模板
Link#include<bits/stdc++.h>using namespace std;const int N=110;double a[N][N];int n;void gauss(){ for(int i=1;i<=n;i++){ int id=i; for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[id][i])) id=j; if(fabs(a[id][i])<1e-6)
2021-10-01 15:39:39
197
原创 C. Kuroni and Impossible Calculation(鸽巢定理)
题意:求∏abs(a[i]−a[j]) mod mm<=1000n<=2e5\prod abs(a[i]-a[j])~mod~m\\m<=1000 n<=2e5∏abs(a[i]−a[j]) mod mm<=1000n<=2e5思路:完全没想到这是个**题,运用鸽巢定理,考虑n>m的时候一定会有个两个模m相同的数,那么答案一定是0。#include<bits/stdc++.h>using namespa
2021-09-30 10:20:43
246
原创 Easy Math 杜教套路 积性函数
Link题意求∑i=1mmu[i∗n]n<=1e12m<=2e9\sum_{i=1}^{m}mu[i*n]\\n<=1e12 m<=2e9∑i=1mmu[i∗n]n<=1e12m<=2e9#include<bits/stdc++.h>using namespace std;#define int long longconst int N=2e6+10;int n,m;int mu[N],sum[N],prime[N],cnt,st[N];
2021-09-29 22:24:43
237
原创 2019西安邀请赛B.product督教筛,推柿子,线性筛约数个数
思路:对于化简下来的可以独角筛优化,期望n^{2/3}复杂度,还用到了如何用线性筛求某个数约数的个数,众所周知,对于任意一个数x,将它分解∏piai\prod pi^{ai}∏piai,答案就是∏(ai+1)\prod(ai+1)∏(ai+1),那么考虑在线性筛的过程中,链接AC代码:#include<bits/stdc++.h>using namespace std;const int N=6e5+10;#define int long longint n,m,mod;un.
2021-09-29 15:16:52
599
原创 字符串 最小表示法
用于处理给定一个串,每次可以将最前面的字母放到最后面,O(n)O(n)O(n)求最小序。用到最小表示法这个神奇的东西,运用双指针,然后暴力枚举k,运用一些性质来让指针对每一个位置只走一次,比如说当前枚举到k,s[i+k]>s[j+k]k,s[i+k]>s[j+k]k,s[i+k]>s[j+k]那么从s[i+k]开始的后缀都是不要的,直接让i+=k+1模板题代码:#include <iostream>#include <cstring>#include &
2021-09-27 17:04:53
219
2
原创 Atcoder AtCoder Beginner Contest 217 G(第二类斯特林数)
题意:给定n,m,n个人,%m相同的人不能分到一组,k是要求的组数,求k=1~n的所有划分方案数。组和组之间方案相同。思路:考虑dp,dp[i][j]前i个人,分到j组,且j组不为空,如果不考虑%m的限制,那么就是斯特林数的板子,dp[i][j]=dp[i−1][j−1]+j∗dp[i−1][j]dp[i][j]=dp[i-1][j-1]+j*dp[i-1][j]dp[i][j]=dp[i−1][j−1]+j∗dp[i−1][j],考虑的话重复在j∗dp[i−1][j]j*dp[i-1][j]j∗dp
2021-09-27 16:17:49
290
原创 AtCoder Beginner Contest 217 F Make Pair(区间dp)
link题意:有2*n个人,有m对好关系,每次只能删除相邻的好关系,问有多少种方式删完所有人。n<=200 m<=n∗(2n−1)n<=200~m<=n*(2n-1)n<=200 m<=n∗(2n−1)思路:由于n很小,考虑区间DP,dp[i][j]删完i~j的所有方案数,可以发现,区间长度为奇数的时候方案一定是0,是没有意义的。那么为了防止重复计数,我们考虑j这个数匹配哪一个数,我们用vector存储,v[a]里存储与a匹配的所有数。那么ve
2021-09-27 14:07:08
335
原创 FWT模板
//#pragma GCC target("avx")//#pragma GCC optimize(2)//#pragma GCC optimize(3)//#pragma GCC optimize("Ofast")// created by myq#include<iostream>#include<cstdlib>#include<string>#include<cstring>#include<cstdio>#includ
2021-09-23 13:14:29
375
原创 AcWing 252. 树 点分治
Link题意:思路:口胡一下点分治,点分治之所以能保证复杂度是他的递归层数<=log(n),是因为树的重心的性质:树的重心中的最大子树也不超过n/2,这样下去n每次都会/2所以最多不超过logn层,然后每一层的复杂度不超过n,甚至可以套一个log。那么回到这题,运用点分治,每次找到目前子树的重心,然后不断递归求解,由于对于当前的点来说<=k的情况只有两种,一种是经过他,一种是不经过他,不经过他可以递归子树求解,经过他,可以暴力求解,暴力存储所有子树点到他的距离,然后容斥一下,也就是排除
2021-09-23 11:24:38
239
原创 icpc网络赛 J Red-Black Paths离线,前缀异或,重构图,暴力剪枝
Link题意:给定一个图,按照时间顺序建图,给点染成红黑色,求相邻两次询问之间新增的红黑路的价值的异或和,红黑路的价值指的是路上每个点的权值乘以长度。数据保证所有红黑路长度<=10。保证所有红黑路<=5000000思路:由于可以离线,我们可以按照时间序来存储图,由于我们只要红开头,黑结尾的,对于其他的我们可以减枝,把无关紧要的点去掉,一看复杂度,∑红黑路<=5000000\sum红黑路<=5000000∑红黑路<=5000000,就算每次暴力搜索红黑路也只有O(10)O
2021-09-23 11:18:02
503
原创 D. The Strongest Build二叉堆,map乱搞
Link题意:给定n个序列,要从每个序列选出一个数,价值为选出来的总和,然后有m个限制,代表m个序列不能用,求最大值 n<=10∑ ci<=2e5 m<=2e5n<=10 \sum~ci<=2e5~m<=2e5n<=10∑ ci<=2e5 m<=2e5思路:一开始想着类似于n路尺取,也就是先把所有最大值放进堆里,然后每次尺取花费最小的,然后会发现会漏掉某些情况。正解是暴力bfs,因为m<=2e5也就是
2021-09-21 20:36:15
433
原创 hdu 6889 数位dp Xor
题意:思路:数位dp,考虑设计状态,第四个条件很好满足,设计一个flag3为状态位就可以了代表是否已经大于w,flag2,flag3代表是否到达枚举x和y的limit,那么第三个条件怎么设计呢,考虑稍微改变一下柿子,x−y<=k && y−x<=k x-y<=k~ \&\&~y-x<=k~x−y<=k && y−x<=k 那么就好办了,考虑x-y+k只有[−1
2021-09-21 20:26:34
258
原创 可持久化并查集模板
Link//#pragma GCC target("avx")//#pragma GCC optimize(2)//#pragma GCC optimize(3)//#pragma GCC optimize("Ofast")// created by myq#include<iostream>#include<cstdlib>#include<string>#include<cstring>#include<cstdio>#i
2021-09-17 11:01:40
227
原创 牛客练习赛88 D都市的柏油路太硬
题意:给定一个图,每两个点之间的距离是他们所有路径中最大值的最小值,求这样的图的最小生成树。有q次询问,求该生成树的a,b之间的最大值。n<=1e5 m<=5e5 q<=1e7思路:是一颗克鲁斯卡尔重构树,求lca,倍增过不去,要么就树剖要么就欧拉序,这里讲一下欧拉序,欧拉序就是遍历一次把他该点存进遍历序列里,dfs遍历的伪代码大概是这样void dfs(int u,int fa){ id[++cnt]=u; in[u]=cnt; dep[u]=dep[fa]+1; for
2021-09-16 00:02:33
271
原创 ICPC 沈阳M - United in Stormwind SOSDP+FWT+容斥
题意:题意是真的难懂,求题目集(0~1<<m)中满足>=k对不同的试卷,两张试卷不同当且仅当至少存在一位不同,而且该位在题目集里。 n<=2e5 m<=20思路:我们可以把a和b当做0和1处理,我们可以先求出i xor j =ki ~xor~ j~=ki xor j =k的对数,为什么处理呢?因为对于任意某个位置为1的话那么就说明这两个试卷是不同的。怎么处理呢?可以fwt,a自己卷自己,先把a[0]减去n,然
2021-09-15 18:49:52
1483
2
原创 树形dp 优化 ICPC南京 M.Monster Hunter
Link题意:有n个点形成一棵树,每个点的贡献是他自身的value和他目前存在的直系儿子的value之和,求依次求出删除0~n个节点的最小贡献。思路:考虑dp[i][j][k],到了i选了j个节点,当前这个节点删不删,那么显然很好转移,当父亲节点和该节点都是存活的情况下,会多额外贡献子节点的value.因为有了状态位,但是如果朴素转移会T,如下for(int i=siz[u]-;i>=0;i--){ for(int j=0;j<=min(i,siz[v]);j++)但是类似
2021-09-15 14:57:47
415
原创 多重背包 二进制优化
思路:原来的复杂度是nms把物品拆成二进制形式,比如说10个物品,其实可以拆成1,2,4,3,1和2和4能表示1~7的所有数,加上三,刚好能表示1到10的所有物品,分组的方式也比较简单,从1开始选,每次乘2,直到不能乘的时候,然后作差剩下的数,然后绑在一块,用01背包模型就可以了#include <iostream>#include <cstring>#include <algorithm>#include<vector>using namesp
2021-09-14 16:48:40
449
原创 Spicy Restaurant (暴力多源bfs)
Link题意:有n个城市,每个城市有个辣度,给你个图,有q次询问求某个点开始,忍耐度为w,求最近辣度<=w的最短路,边权为1。q<=5e5 n<=1e5 m<=1e5 wi,w<=100q<=5e5 \space n<=1e5 \space\space \space m<=1e5 \space wi,w<=100q<=5e5 n<=1e5 &nb
2021-09-14 08:57:27
585
1
原创 CF785D Anton and School - 2(范德蒙德行列式卷积)
题意:给定含有(和)的字符串,求带有((()))类似的子序列的方案数(左括号等于右括号)思路:很容易想到枚举每个左括号的最后一个位置,cnt代1~i-1中(的数量,cnt2代表后缀的)的数量那么显然答案就是∑i=1n[s[i]==(]∑j=0min(cnt,cnt2−1)C(cnt,cnt−j)∗C(cnt2,j+1)\sum_{i=1}^{n}[s[i]== (]\sum_{j=0}^{min(cnt,cnt2-1)} C(cnt,cnt-j)*C(cnt2,j+1)∑i=1n[s[i]==(]
2021-09-13 14:30:31
534
1
原创 Buds Re-hanging 拆树苗 合并
题意:给定一棵树,树苗定义为至少存在一个子节点并且子节点都是叶子,每次可以选择一颗树苗挂到某个节点下,求最小根节点数。思路:可以观察到挂到某个节点下,一定是挂到他的叶子结点,这样会对答案贡献减1,那么我们是不是可以把问题转化成最多的树苗数了?贡献就是树苗数-1,那我们考虑能不能从下往上尽量拆,遇到能拆的尽量拆,这样可以变成更多个树苗了。link// Problem: E. Buds Re-hanging// Contest: Codeforces - Codeforces Global Roun
2021-09-13 11:46:21
358
原创 旅行家问题2(TSP,奇怪的转化模型)
link题意:旅行商问题,每ai->aj的边权为max(aj-ai,ci),求从1开始走,走完所有城市并且回到1的最小花费。思路:可以证明肯定是一个环,假设不是环,也就是有个非起点会被经过至少两次,这里假设两次,ai,aj,ak,其中aj为中转点,那么max(ci,aj-ai)+max(cj,ak-aj)>=max(ci,ak-ai),肯定是不优的,那么我们考虑先把ci提出来,变成常数项,也就是所有ci加起来加上max(0,aj-ai-ci),我们可以发现如果ai比aj大,那么ai到aj
2021-09-12 21:56:38
536
4
原创 lzh的蹦床 差分,贡献,思维
题意:给定一个序列a,每次走都会从i跳到i+a[i],并且可以把路径上的数都减去1,和1取max,问最小走多少趟把整个序列变为1。思路:由于可以都从1开始遍历,从前往后遍历,考虑第i个数被遍历的时候前面的数对ta造成的影响,由于每个数都要从a[i]降到2,是一段区间,显然可以差分维护,所以假设前面的贡献我们已经更新,我们计算可以少走多少趟,那还有个问题,如果前面的数对他造成的影响溢出了会怎么样呢?那么也就是说a[i]变成1以后又要多走溢出次的累计到后面的差分里去。那么这题就做完了。// Probl.
2021-09-12 21:43:17
267
2
原创 数字染色 gcd>1的子序列个数 容斥、莫比乌斯函数
link题意:长度为n的数组a,求gcd>1的子序列个数思路:考虑用容斥,把gcd拆成素数的乘积,先对a中的所有数都进行因子分解,然后每次计算,gcd是某个值x的倍数的方案数,那么对于任意因子p1p2p3…,我们考虑去重即可,会发现刚好是莫比乌斯的mu函数,质因子为2和以上的就不用算了,我们考虑单质因子的部分就能不重不漏的计算所有平方及以上的所有答案了,我们会发现某个数乘了一个单因子他的符号刚好就是*-1,刚好符合莫比乌斯函数的性质。如2计算了,3也计算了,那么就要去掉6的贡献。#inclu
2021-09-12 10:22:49
542
1
原创 P3223 [HNOI2012]排队 排列组合,python高精
题意:n个男生,m个女生,2个老师,求老师不能相邻,女生不能相邻的方案数。思路:先把老师当作男生对待,最后减去老师相邻的方案,可以用插板法将女生插进男生堆里,由于要高精度,懒得写,搞一手py哈哈答案就是不考虑老师-考虑老师的方案数import mathdef f(x): return math.factorial(x)def C(x,y): if(x<y): return 0 return f(x)//f(y)//f(x-y)a=input().split()n=int(a[
2021-09-11 09:53:46
353
原创 小x的数学题
题意:n<=1e18 m=1e4,求(10^n)/m下取证mod m的值思路:(10^n-m*m)/m %m =原柿子,所以我们直接将10的n次膜上m^2,在求就可以了。代码太简单不加了。
2021-09-10 11:51:21
235
原创 贪心 田忌赛马
link题意:有不同的马,两个序列,a和b,可以重新安排a,如果ai>bi 赚200,ai=bi 不赚钱 ai<bi 亏损200问最多能赚多少钱。思路:考虑贪心,把a和b都排序,维护四个指针,如果a的最大数比b的最大数大,那么直接赚,如果<=,比较a和b的最小数,如果还是比不过,之间换掉b的最大值,反正都会输。// Problem: Tian Ji -- The Horse Racing// Contest: Virtual Judge - HDU// URL: https:
2021-09-10 11:48:36
263
2
原创 再探water Balance(贪心,单调栈)
题意:给定一个序列,你每次可以选一段区间,把这个区间的每个数浮赋值成平均值,问最小字典序。思路:最后的答案一定是不降的,那么启发我们维护区间的平均值,平均值用区间sum和长度代替,那么就是可以在弹栈的时候可以体现,当后面平均值一直小于前面块的平均值。比较的时候a/b<c/d分别把d和b乘过去,避免精度的影响。代码:// Problem: 小x的序列// Contest: 信息学奥赛比赛系统// URL: https://qduoj.com/contest/114/problem/C//
2021-09-10 08:11:28
214
原创 dfs python
n=int(input())st=[]for i in range(1,n+2): st.append(0)res=[]def dfs(num): if num==0: for x in res: print(x,end=' ') print('') return for i in range(1,n+1): if(st[i]==0): st[i]=1
2021-09-07 13:23:21
252
4
原创 CF1136D Nastya Is Buying Lunch 贪心
link题意:给定n个人,m条边,对于一条u,v的边,如果u在v的位置的前面,那么可以交换u和v,最后问pos n 的这个人能往前换多少位置。思路:考虑从pos大的位置从前往后考虑,对于当前这个位置,如果不换肯定不是更优的,假设当前位置是x,对于x-1的数,在后面的序列,假设原来能访问后面的序列,但是不能访问x,那么不换就访问不了了。所以可以动态维护位置,维护位置的方式也很简单,对于他们的位置,交换一次更新一次。代码:// Problem: D. Nastya Is Buying Lunch/
2021-09-07 10:17:31
286
原创 D. Expression Evaluation Error(贪心,数学规律)
link题意:求n个数,这n个数和10进制为s,求他们11进制的最大值。思路:考虑先能不能无花费拆分,这里的无花费指的是两个数在11进制相加还是原数,例如2030,2和3都是可以拆的,拆成1030和1000,然后如果数列中还不满足的话,那么这些数都是满足100…这种形式的。由于花费要小,我们可以贪心的选择最小的数,并且拆掉一个次高位。例如1000拆成900和100,如果拆成1和999,和比前面那种拆法小,不优。代码:// Problem: D. Expression Evaluation Err
2021-09-06 15:01:50
638
2
原创 Add or Multiply 1 (第二类Strling 数)
题意:给定n个加数m个乘数求最后本质不同的多项式数量。思路:有一个性质,假设先单独讨论加法,对于某个数ai,我们假设加法和乘法组数为x和y,对于不同组之间的ai,无法构造出和刚才序列相同的多项式。那么启发我们思考,对于加法和乘法两个是独立的,加法组内无序,乘法组内也是无序,但单单对组数有要求,|x-y|<=1才可以,例如++−−++,−−++−−,−−++,++−−++ - - ++,--++--,--++,++--++−−++,−−++−−,−−++,++−−x和y是加法乘法的组数。而且组和.
2021-09-04 23:15:20
320
原创 E. Road to 1600(构造,打表)
题意:构造方格1~n*n,皇后和车的走法如图,皇后和车会走当前能走的位置中没走过的值最小的来走,如果没有花费就会加1并且跳到整个图中没走过中的最小的方格来走,让你构造一个矩阵,使得车的花费比皇后少。思路:n<=2显然是无解的,n=3可以通过打表打出来,然后想想怎么拓展,我们可以通过走蛇形矩阵的方法,先蛇形递增的摆放食物诱导皇后和车同轨迹走,最后让车和皇后走到n,1或者1,n,(取决于n的奇偶性),然后皇后会跳进子问题n=3的陷阱,那么皇后就输了。代码:// Problem: E. Road.
2021-09-02 17:38:01
277
2
原创 Kuriyama Mirai and Exclusive Or
link题意:给定一个序列,两种操作,一种区间异或上一个常量x,第二种是区间异或上常量x+一个从0开始的等差数列。思路:第一种操作很好维护,通过差分数组来维护,就类似于加法的差分数组,第二种呢,严格意义上来说就是对于一个数y ^ (x+i),貌似不是很好维护,那么我们考虑异或的性质,如果i当前小于x的lowbit,那么加号和异或是等价的,可以直接变成y ^ x ^ i ,如果这样的话那么就好操作了,我们考虑一段一段的区间,把当前的l,r分为不超过log的区间,每一段区间都是x的lowbit,那么就和
2021-09-02 12:31:26
285
原创 Sweet Game
题意:有点绕,简单来说就是每次选一个位置a[i],i+1~n在之前要选完或者一点都没选,价值会随时间改变d[i],问最大价值是啥。思路:挺妙的。考虑倒着枚举n,那么考虑假设枚举到了x,我们对于当前的序列,我们只能插入到队首或者队尾,那么我们只需要考虑队首的贡献和队尾的贡献哪个最大就可以了。std:// Problem: Sweet Game// Contest: NowCoder// URL: https://ac.nowcoder.com/acm/contest/11235/D// Me.
2021-08-28 23:01:25
365
原创 后缀数组模板
#include<bits/stdc++.h>using namespace std;string s;const int N=300010;int sa[N];int x[N];int y[N];int c[N];int height[N];int rk[N];int n,m;void get_sa(){ for(int i=1;i<=n;i++) ++c[x[i]=s[i]]; for(int i=1;i<=m;i++) c[i]+
2021-08-22 01:09:23
230
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅