题目链接:51Nod 1006 最长公共子序列Lcs 题目大意: 题解: 最长公共子序列模板题,设\(dp[i][j]\)为字符串\(A[1...i]\)与字符串\(B[1...j]\)的最长公共子序列长度,则状态转移方程为: \[dp[i][j] = max\{dp[i-1][j-1] + (A[i] == B[j]), dp[i-1][j], dp[i][j-1]\} \]用\(pre\)数组记录上
题目链接:51Nod 1183 编辑距离 题目大意: 题解: 设\(dp[i][j]\)为字符串\(A\)的前\(i\)个字符变成字符串\(B\)的前\(j\)个字符需要的最小操作数。 若字符串\(A\)的第\(i\)个字符与字符串\(B\)的第\(j\)个字符相等,则问题变成将字符串\(A\)的前\(i-1\)个字符变成字符串\(B\)的前\(j-1\)
题目链接:51Nod 2649 完全背包 题目大意: 题解: 完全背包模板题。 #include <iostream> using namespace std; int dp[50010], v[110], c[110], n, V; int main() { cin >> n >> V; for (int i = 1; i <= n; ++i) { cin >> v[i] >> c[i]; }
题意 题目链接 Sol 直接拿set维护\(li\)连续段。因为set内的区间互不相交,而且每个线段会被至多加入删除一次,所以复杂度是对的。 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP make_pair #define fi first #define se second using namespace std; const int
题意 题目链接 Sol 这题是来搞笑的吧。。 考虑一个数的贡献是\(O(\frac{N}{i})\) 直接数论分块。 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second #define int long long #define LL long long #d
基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。具体定义如下: 如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), mi
3039 叶子节点的路径 给出一棵n个节点的树,节点编号为1-n(根节点编号为1)。对于每一个叶子节点,输出从根到叶子的路径。(按照路径的字典序)。 输入 第一行:1个数n(2 < n <= 1000),表示树的节点数量。 后面n-1行:每行2个数x y,表示节点x是节点y的父节点(1 <= x, y <= n)。 输出 输
http://www.51nod.com/Challenge/Problem.html#problemId=1122 如果整体考虑4个机器人会感觉没有头绪,但是如果我们只单独考虑每一个每一个机器人的最终位置,即分别枚举4个机器人的终点(共4!种可能),这样4个机器人到对应终点处的方案数相乘就是答案。 如何求一个机器人从位置i走n步走到
题目链接:传送门 题目思路:对于每一个笑话,用动态开点线段树来维护区间是否被覆盖(笑话是否已经被这些人听过),先假定范围内全部没听过(置1),然后再将该范围包含的被覆盖的区间置0; 代码: #include<bits/stdc++.h> #pragma GCC optimize(2) using namespace std; typedef long long LL; typ
前缀异或,\([1 \sim l-1]\)异或两次为\(0\),而\(0\)与任何数异或值都不变。 const int N=1e5+10; int a[N]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]^=a[i-1]; } cin>>m; while(m--)
题意 给出2个数a,b的 Gcd(最大公约数n) 和 Lcm(最小公倍数m) ,求所有符合条件的a,b中,a + b的最小值。 思路 代码 #include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset const int N = 1e6 + 10; const int m
题目链接 这天,lyk又和gcd杠上了。 它拥有一个n个数的数列,它想实现两种操作。 1:将 a i a_i ai 改为
Description 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。(只能向右和向下走) Solution 记$f_i$为第一个走到的坏格为第$i$个的方案数 于是有 $$f_n=\binom{x+y}{x} - \sum _{i=1}^{n-1} f_i\binom{x+y-x'-y'}{x-x'} $$ $O(n^2)$转移即可 #in
原题链接:点这里 很明显,瓦西亚会取当前能够拆的方块中编号最大的一个,皮台亚会取当前能够拆的方块中编号最小的一个。 证明很简单,以瓦西亚为例,若瓦西亚不取最大的一个,就算后面全取最大的也抵不过当前与最优解的差距。 那么,我们可以维护一个\(set\),存放当前所有能够拆的方块的编号。
题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=2500 对准备看这个的同学们说一句忠告: 1、如果你们想看这道题的枚举办法,再见~。 我们这里没有讲这个 2、如果你连栈是啥都不知道,再见~ 我们这里也没有讲这个 3、如果你知道单调栈,不知道关系的话,欢迎加入
Problem 每一个正整数都可以表示为若干个斐波那契数的和,一个整数可能存在多种不同的表示方法,例如:14 = 13 + 1 = 8 + 5 + 1,其中13 + 1是最短的表示(只用了2个斐波那契数)。定义F(n) = n的最短表示中的数字个数,F(14) = 2,F(100) = 3(100 = 3 + 8 + 89),F(16) = 2(16 = 8 + 8 = 13 + 3)。定义
Problem 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。(只能向右和向下走) Solution 黑点里加入右下的点,每个点求一个ans[i],代表走到这个点的方案数。 ans[i]初始为C(n+m-2,m-1),对于所有在它左上的点,都减去那个点的ans[j]乘i、j之间的方案数。 (
题意 考虑转化下\(f(S)\): 我们考虑\(S\)的\(fail\)树上的每一个点\(x\),如果\(x\)到\(0\)的路径上有\(cnt\)个点(除去\(x\)和\(0\)),那么就会对\(f(S)\)产生\(cnt\)的贡献,于是现在\(f(S)\)变为了每个点会对很多点产生\(1\)的贡献,最后求和。 我们知道每个点代表一个前缀,那么我们就可以
题意 我们知道一个结论:\(\gcd(f_x,f_y)=f_{\gcd(x,y)}\)。 证明见这里。 于是我们考虑将\(lcm\)向\(\gcd\)方向化,我们知道\(lcm\)是给指数取\(\max\),\(\gcd\)是给指数取\(\min\),因此考虑\(\min-\max\)容斥: \(lcm(S)=\prod\limits_{p}p^{\max(S)}=\prod\limits_p p^{\sum\limits_{T
题目: 错误思路: 刚开始尝试使用Java大数打一下表,得到了一个错误规律,让我在WA了两天之后看着题解还是不明白。 对比正确题解才知道在35之后我的规律错误了,给了我死刑,ok,换思路吧。。。 正确思路: 二分,判断中间值 mid 是否满足 mid 的阶乘后的零的个数满足条件,满
51nod 1847 奇怪的数学题(min25) http://www.51nod.com/Challenge/Problem.html#problemId=1847 设\(f(n)\)为\(n>1\)的次小约数(\(f(1)=0\)),很显然\(f(n)={n\over {\rm minp} (n)}\),其中\({\rm minp}(n)\)表示n的最小质因数。 原式就变成 \[\sum_i^n\sum_j^n f(\gcd(i,j))^k \]先
Link 设\(f(i)=\sum\limits_{j=1}^i\sum\limits_{k=1}^i\operatorname{lcm}(\gcd(i,j),\gcd(i,k))\),那么\(ans=\sum\limits_{i=1}^nf(i)\)。 根据直觉\(f(n)\)肯定是积性函数。 \[\begin{aligned} f(n)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\operatorname{lcm}
题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=1010 一、题目描述 K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。 例如:n = 13,S中 >= 13的最小的数是15,所以输出
题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=2989 一、题目描述 组合数C(m,n),表示从M个数中选择N个,有多少种不同的方法。 组合数的计算公式如下: 给出m,n输出C(m,n)最后9位数,去掉前缀的0。 输入 一行,两个正整数N和M(N<=1000000,M<=1000000)。 输出 一行,输
题目网址:http://class.51nod.com/Challenge/Problem.html#problemId=2652 一、题目描述 给出一个数k,求最小的n,使得n的阶乘后面0的数量>=k。 例如k=1,5的阶乘 = 1*2*3*4*5 = 120,120后面有1个0。并且4的阶乘后面没有0,所以5是最小的结果。 输入 一个数k(1 <= k <= 10^9) 输出 输出最