YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

03 2020 档案

摘要:题解:素数区间问题。注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以。如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sqrt(n)之前的数来把sqrt(n)之后的素数给筛出来。 首先进行1e6的素数打表。然后对每个l,r,首先找到第 阅读全文
posted @ 2020-03-30 21:50 Target--fly 阅读(143) 评论(0) 推荐(0)

摘要:算是一个找规律的题目吧。 枚举前sqrt(n)个数,数i出现的次数为n/i-n/(i+1),对答案的贡献为(n/i-n/(i+1))*i。 对于sqrt后边的数,可以直接由n/i获得,并且一定只出现一次。 (数学果然博大精深~~~~) code: #include<bits/stdc++.h> us 阅读全文
posted @ 2020-03-30 17:46 Target--fly 阅读(140) 评论(0) 推荐(0)

摘要:题目给的时间限制是3s,所以可以直接暴力来做,注意n的取值范围是1e8,如果开一个1e8的数组会RE。分段打表,可以每100个数记录一次,然后对每次询问先找到它所在的区间,然后在暴力往后找。(学到了~~) #include<bits/stdc++.h> using namespace std; co 阅读全文
posted @ 2020-03-30 11:53 Target--fly 阅读(151) 评论(0) 推荐(0)

摘要:题目大意:很好理解,一个for循环语句,从a开始到b结束,步长是c,模数是pow(2,k) 问,最少循环多少次,才能到达b,如果永远都到不了b,输出FOREVER 题解:其实就是求一个线性方程,cx=b( mod p)。问x最小是多少。 这个线性方程怎么来的呢?从a开始假设我们走了x步,到达了b,则 阅读全文
posted @ 2020-03-27 21:11 Target--fly 阅读(144) 评论(0) 推荐(0)

摘要:乘法逆元问题,常常以这这样的形式出现 a/b ( mod p )=a*(p1)( mod p),b是关于p的逆元。 求解乘法逆元的几种方法: 1 费马小定理,a在模p下的逆元,要求p为质数。 ll fpm(ll x, ll power, ll mod) { x %= mod; ll ans = 1; 阅读全文
posted @ 2020-03-27 17:25 Target--fly 阅读(165) 评论(0) 推荐(0)

摘要:题目链接:https://codeforces.com/problemsets/acmsguru/problem/99999/106 这个题是关于EXGCD特别好的一个题目。题目大意:有一个等式ax+by+c=0,输入a,b,c以及a的范围l1,r1和b的范围l2,r2,输出满足方程的整数解的个数。 阅读全文
posted @ 2020-03-27 15:47 Target--fly 阅读(213) 评论(0) 推荐(0)

摘要:例题:https://www.acwing.com/problem/content/1272/ ST表类似于dp。 定义st[i][j]表示以i为起点,长度位2^j的一段区间,即[ i , i + 2^j - 1 ]。 而这个区间又可以被拆分为[i,i+2^(j-1)-1]+[ i + 2 ^ ( 阅读全文
posted @ 2020-03-26 22:04 Target--fly 阅读(177) 评论(0) 推荐(0)

摘要:题目大意:有一个矩阵,"."表示石头,"#",表示小草,有两个人,可以在任意两个位置点燃小草,小草可以上下左右蔓延,蔓延一次的时间为1,问所有蔓延完所有小草所花费的最短时间。如果不可能蔓延完所有的小草,输出-1。 题解:暴力枚举两个点的位置,然后以这两个点为起点,将这两个点放入队列中,跑bfs。(属 阅读全文
posted @ 2020-03-26 18:16 Target--fly 阅读(99) 评论(0) 推荐(0)

摘要:题目大意: 一共有61个位置,标记为0~60。其中有10个重要位置,分别为:5, 12, 22, 29, 33, 38, 42, 46, 50 and 55。 有一个筛子,一共6个面,标有1~6。摇到几走几步,开始的位置是在0,一共可以要10次。 输入筛子摇出每个面的概率,输出经过这10个重要位置的 阅读全文
posted @ 2020-03-26 14:53 Target--fly 阅读(113) 评论(0) 推荐(0)

摘要:题目大意:输入两个数 a,b,输出一个k使得lcm(a+k,b+k)尽可能的小,如果有多个K,输出最小的。 题解: 假设gcd(a+k,b+k)=z; 那么(a+k)%z=(b+k)%z=0。 a%z+k%z=b%z+k%z;a%z=b%z;(a-b)%z=0; 也就是说,z一定是a-b的因子。a- 阅读全文
posted @ 2020-03-25 17:37 Target--fly 阅读(231) 评论(0) 推荐(0)

摘要:只看懂了CRT,EXCRT待补。。。。 心得:记不得这是第几次翻CRT了,每次都有迷迷糊糊的。。 中国剩余定理用来求解类似这样的方程组: 求解的过程中用到了同余方程。 x=a1( mod x1) x=a2( mod x2) x=a3( mod x3) 假设: n1=a1( mod x1) n2=a2 阅读全文
posted @ 2020-03-24 18:10 Target--fly 阅读(177) 评论(0) 推荐(0)

摘要:题目大意:切割图形,给你一个非0即1的矩阵,将它切割成多个长方形,使每个小长方形中1的个数不得多于k个,切割的规则,要么切一整行,要么是一整列、 题解: 二进制枚举。 注意行数最大才是10。用二进制枚举切割某一行,然后在枚举每一列是否需要切割。时间复杂度O(2^h*m) code: #include 阅读全文
posted @ 2020-03-23 20:35 Target--fly 阅读(276) 评论(0) 推荐(0)

摘要:题目大意:将范围从1~pow(2,64)-1内的super power输出。super power的定义:一个数x至少存在两种x=pow(i,k),(k!=1)。 题解: 注意数据范围2的64次方-1,而long long 的范围是2的63次方-1,所以要用unsigned long long。 一 阅读全文
posted @ 2020-03-22 18:23 Target--fly 阅读(154) 评论(0) 推荐(0)

摘要:两种思路: 1 单调栈:维护一个单调非递减栈,当栈为空或者当前元素大于等于栈顶元素时就入栈,当前元素小于栈顶元素时就出栈,出栈的同时计算当前值,当前值所包含的区间范围为从当前栈顶元素到当前元素i的距离加上栈顶元素到第二个栈顶元素的距离。 code: #include<bits/stdc++.h> u 阅读全文
posted @ 2020-03-22 16:08 Target--fly 阅读(139) 评论(0) 推荐(0)

摘要:转自:https://www.cnblogs.com/Mychael/p/8759124.html 1 对于质数:φ(n)=n−1 2 对于n=p^k φ(n)=(p−1)∗p^(k−1) 3 两个互质的数n和m,φ(n∗m) = φ(n) ∗ φ(m) 4 小于nn且与nn互质的数的和:S=n∗φ 阅读全文
posted @ 2020-03-21 09:42 Target--fly 阅读(148) 评论(0) 推荐(0)

摘要:题目大意: 累加从1到n,任意两个数的gcd(i,j)(1=<i<n&&i<j<=n)。 题解:假设a<b,如果gcd(a,b)=c。则gcd(a/c,b/c)=1。也就是说a/c和b/c互质,而与a/c互质的数一共有oula(a/c)个,也就是说这里的b/c一共有oula(a/c)种选择,同理,g 阅读全文
posted @ 2020-03-21 09:35 Target--fly 阅读(240) 评论(0) 推荐(0)

摘要:简单dp。 题目大意:有n种珍珠,这n种珍珠有不同的需求量,不同的价格,价格越高,质量越高,在购买每一种珍珠时,都需要在原来的基础上多买10个。也就是说如果需要买x种珍珠,那就要付x+10个的钱。每一种珍珠必须购买大于等于自身价格的珍珠 输入一个t(100以内)表示t组测试,一个n,n种珍珠,a[i 阅读全文
posted @ 2020-03-20 16:42 Target--fly 阅读(112) 评论(0) 推荐(0)

摘要:题目大意: 插入最少的字符,使原字符串成为回文串。 题解: LCS问题,将字符串反转,然后求这俩字符串的LCS,总长度减去LCS即可(多组输入)。 N最大是5E3,直接用二维数组会超内存。所以要用到滚动数组。 code: #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2020-03-19 19:34 Target--fly 阅读(87) 评论(0) 推荐(0)

摘要:欧拉函数。 欧拉函数打表模板: #define maxn 3000010 int p[maxn]; void oula(){ int i,j; for(i=1; i<=maxn; i++) p[i]=i; for(i=2; i<=maxn; i+=2) p[i]/=2; for(i=3; i<=ma 阅读全文
posted @ 2020-03-19 15:54 Target--fly 阅读(98) 评论(0) 推荐(0)

摘要:题目大意:每一个城市都有一定的魅力值,然后有一个有向图,根据这个有向图从1到n+1所获得的魅力的最大值,并输出路径(要求只能从编号娇小的城市到编号较大的城市)。 题解:很容易想到最短路+路径纪录。但是感觉有点小题大做了。我开始的方法是dfs+dp,dp[i]表示i的子节点最大的魅力值,但是它给的是一 阅读全文
posted @ 2020-03-18 18:05 Target--fly 阅读(110) 评论(0) 推荐(0)

摘要:题意: 略; 感觉被演了一波,这是CFdiv2吗? 算是这个构造题吧。 1 首先我们可以将u进行二进制拆分来考虑。加入u>v那么小与v的那些数在怎么拼接也无法使异或值为u。 比如二进制U=1 0 1 1 0。怎么才能异或成这个数呢?无非就是让1所在的位置的1的个数为奇数就行了,也就是构成异或成U的最 阅读全文
posted @ 2020-03-17 19:53 Target--fly 阅读(143) 评论(0) 推荐(0)

摘要:MMP,差一点就做对了。 题目大意:给你一个树,对这个树的边进行编号,编号要求从0到n-1,不可重复,要求MEX(U,V)尽可能的小, MEX(x,y)的定义:从x到y的简单路径上,没有出现的最小编号。 题解: 只要让0,1,2这三个号不在同一条路径上就行。 如果说是一条没有分支的树,那么无论怎么编 阅读全文
posted @ 2020-03-17 16:38 Target--fly 阅读(120) 评论(0) 推荐(0)

摘要:题目大意: 值得注意的一点是题目要求的是这些子段之间的最大整数和。注意和Max Sum Plus Plus 这个题目的区别。 题解: 线性区间DP,对每一段考虑取或者不取。定义状态dp[i][j]指的是前i个数分为j段。 如果第j段不选的话dp[i][j]=dp[i-1][j],直接就是上一个状态的 阅读全文
posted @ 2020-03-17 15:09 Target--fly 阅读(145) 评论(0) 推荐(0)

摘要:概率+0 1背包 要算成功的最大概率,那就是失败的最小概率,所以01背包直接让失败的概率最小就行了。 注意: 概率与概率之间是要相乘的,不是相加。 #include<bits/stdc++.h> using namespace std; const int N=1e4+7; int weight[N 阅读全文
posted @ 2020-03-16 12:19 Target--fly 阅读(109) 评论(0) 推荐(0)

摘要:题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡的。 题解:定义状态dp[i][j]为第i次觉是在j时刻睡的,那么状态转移方程dp[i][j]=ma 阅读全文
posted @ 2020-03-14 10:02 Target--fly 阅读(221) 评论(0) 推荐(0)

摘要:题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数。 读题的时候题意特别不理解,何为最大次数,何为最小次数? 1 比如说当在一个点时,到终点的最短路线就那一个,也就说我只能走这一条,不用重新规划。 2 在一个 阅读全文
posted @ 2020-03-13 16:42 Target--fly 阅读(130) 评论(0) 推荐(0)

摘要:题目大意:删除字符,当一个字符左边或者右边存在一个比它小“1”的字符那么就可以将这个字符删除,问最多能删除多少个字符 思路,:刚开始想的是,对于单调连续的字符,可以直接删除,比如,单点增的字符只保留前边的就行了,单调减的只保留后边的。。。然后知道不能删除为止。然后wa了一下午。。 正解是复杂度是O( 阅读全文
posted @ 2020-03-12 16:14 Target--fly 阅读(132) 评论(0) 推荐(0)

摘要:题目大意: 第一行一个n,表示共n个月份,然后第二行分别表示一个工人的聘请工资,月薪水,解雇工资。第三行是n个月每个月需要的工人的最少数目。然后求最少花费 题解: dp[i][j] 表示第i个月聘请j个人需要的最少花费。 状态是怎么转移的呢? 当第i-1个月聘请k个人时。 如果k<j。需要聘请新人 阅读全文
posted @ 2020-03-11 17:01 Target--fly 阅读(132) 评论(0) 推荐(0)

摘要:题目大意: 输入两个数n和m,n表示有n个数,这n个数是一个多项式的前n项,让输出这个序列的n+1,n+2,..n+m项。 题解:差分规律,一直差分,直到全为0或者只剩下一个数。然后再递推回去。 给出了n个数,最多可以求n-1行差分,从最后一行向上推,共n行。所以总复杂度O(n^2+n*m). #i 阅读全文
posted @ 2020-03-11 15:41 Target--fly 阅读(178) 评论(0) 推荐(0)

摘要:题意: 输入n行数,没行由2*n个数,表示一个坐标(x,y)。 如果x和y 1表示从该点(i,j)出发,按照构造的前移动不会停下。 否则就要到点(x,y)处停下。 题解: 首先处理-1 枚举每个-1的坐标,判断四个方向是否存在-1的情况。如果不存在就可以结束了,否则就将移动方向保存到棋盘中。 然后处 阅读全文
posted @ 2020-03-10 21:04 Target--fly 阅读(162) 评论(0) 推荐(0)

摘要:https://blog.csdn.net/someone_and_anyone/article/details/81044153 当串1 和 串2 的位置i和位置j匹配成功时, dp[i][j]=dp[i-1][j-1]+1,也就是说此状态由状态dp[i-1][j-1]转移而来,用数组记录为1, 阅读全文
posted @ 2020-03-10 18:02 Target--fly 阅读(216) 评论(0) 推荐(0)

摘要:题目大意: 两个字符串,可以再中间任何插入空格,然后让这两个串匹配,字符与字符之间的匹配有各自的分数,求最大分数 最长公共子序列模型。 dp[i][j]表示当考虑吧串1的第i个字符和串2的第j个字符时,当前的最大分数,当前有3中可能, 1,i与j直接匹配,那么这个状态是由dp[i-1][j-1]转移 阅读全文
posted @ 2020-03-10 16:40 Target--fly 阅读(169) 评论(0) 推荐(0)

摘要:数学题 在f(x)和g(x)的系数里找到第一个不是p的倍数的数,然后相加就是答案 为什么? 设x1为f(x)中第一个不是p的倍数的系数,x2为g(x)...... x1+x2前的系数为(a[x1+x2]*b[0]+a[x1+x2-1]*b[1]..)+a[x1]*b[x2]+(.....a[0]*b 阅读全文
posted @ 2020-03-09 20:34 Target--fly 阅读(123) 评论(0) 推荐(0)

摘要:高精度阶乘 #include<iostream> #include<string.h> using namespace std; int main(){ int n,A[100000]; cin>>n; memset(A,0,sizeof(A)); A[0] = 1; int bit = 0; fo 阅读全文
posted @ 2020-03-05 20:58 Target--fly 阅读(130) 评论(0) 推荐(0)

摘要:https://blog.csdn.net/w_udixixi/article/details/104479288 大意:n个数,每个数只能向上加,a[i]+1需要的时间是t[i],求使这n个数无重复数字的最少时间。 题解:并查集+贪心。怎么用并查集呢?当一个数第一次出现时,将x和x+1连起来,当我 阅读全文
posted @ 2020-03-04 19:48 Target--fly 阅读(167) 评论(0) 推荐(0)

摘要:最长上升子序列o(nlongn)写法 dp[1]=a[1]; int len=1; for(int i=1;i<=n;i++){ if(a[i]>dp[len]) dp[++len]=a[i]; else *lower_bound(dp+1,dp+1+len,a[i])=a[i]; } 数组dp[l 阅读全文
posted @ 2020-03-04 16:08 Target--fly 阅读(127) 评论(0) 推荐(0)

摘要:用二位数组dp[i][j]记录组数为i,前j个数字的最大子段和。 转移方程dp[i][j]=min(dp[i][j-1],dp[i-1][k])+arr[j],方程表示的是考虑到第j个数,可以把它直接加入到第i组,也可以作为第i组的开头,如果作为第i组的开头,就要考虑第i-1组该以哪个数结尾。直接枚 阅读全文
posted @ 2020-03-04 11:51 Target--fly 阅读(173) 评论(0) 推荐(0)

摘要:详细解析 树状数组可以解决查询前缀和/区间和问题。 模板(单点修改) int lowbit(int i) { return i & -i;//或者是return i-(i&(i-1));表示求数组下标二进制的非0最低位所表示的值 } void add(int i,int val)//更新单节点的值 阅读全文
posted @ 2020-03-02 18:20 Target--fly 阅读(102) 评论(0) 推荐(0)