CSU - 1446 Modified LCS

2024-06-05 21:48
文章标签 lcs modified 1446 csu

本文主要是介绍CSU - 1446 Modified LCS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

Input

Output

Sample Input

3
5 3 4 15 3 1
10 2 2 7 3 3
100 1 1 100 1 2

Sample Output

4
3
50

题意:求两个等差序列相同的元素个数

思路: 首先我们可以假设得到解是当 F1 + D1 * K1 = F2 + D2 * K2,那么我们可以通过扩展欧几里德算法来求出最小的正数解,再来是当我们知道一组解是(x0, y0)的时候,任意解都可以是(x0 + kb', y0-ka') {b' = b/gcd, a' = a/gcd},在各自的范围内求解,注意处理范围里有多少解的时候最好模拟一下,容易理解

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
typedef long long ll;
using namespace std;ll x, y, g;void exgcd(ll a, ll b) {if (b == 0) {x = 1;y = 0;g = a;return;}exgcd(b, a%b);ll t = x;x = y;y = t - a / b * y;return;
}int main() {int t;ll n1, n2, f1, f2, d1, d2;scanf("%d", &t);while (t--) {cin >> n1 >> f1 >> d1 >> n2 >> f2 >> d2;ll f = f2 - f1;exgcd(d1, -d2);if (f % g) {printf("0\n");continue;}else {ll r = abs((-d2)/g);x = ((x * f / g) % r + r) % r;y = (f - x * d1) / (-d2);ll dx = abs(d1 / g);ll dy = abs(d2 / g);ll ans = min((n1 - 1 - x) / dy, (n2 - 1 - y) / dx) + 1;cout << ans << endl;}}return 0;
}




这篇关于CSU - 1446 Modified LCS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034261

相关文章

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10066 LCS

题意: 最长公共子序列。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include

NLP文本相似度之LCS

基础 LCS(Longest Common Subsequence)通常指的是最长公共子序列,区别最长公共字串(Longest Common Substring)。我们先从子序列的定义理解: 一个序列S任意删除若干个字符得到新的序列T,则T叫做S的子序列。 子序列和子串的一个很大的不同点是,子序列不要求连接,而子串要求连接。 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y

最长公共子串(LCS)

(1) 找出两个字符串的最长公共子串 题目:输入两个字符串,找出两个字符串中最长的公共子串。 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。 #include<iostream>#include<string>using namespace std;int main(){string s1 = "GCCCTAGCCAGDE";string s2 = "GCGCCAGT

LCS转为LIS

(1) 先将所有数列排序。     第一维由小到大,当第一维相等时,第二维由大到小。   (排序规则亦可改成以第二个维度为主,最后则是找第一个维度的1DLIS。)       a     a    a     b     b    a     a     a    c     d   (0,6) (0,3) (0,2) (1,4) (1,1)(2,6) (2,3) (2,2) (3,5) (4,

【UVA10405】【裸LCS】

坑点在于输入有空格 #include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <c

CSU - 1556 Jerry's trouble(快速幂取模)

【题目链接】:click here 【题目大意】:计算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 <= m < 1000) 【解题思路】:快速幂取模 代码: solution one: #include<bits/stdc++.h>#define LL long longusing namespace std;const

lightoj1033 - Generating Palindromes (LCS)

题意:给你一个字符串,至少需要添加多少字符可以使得它变成一个回文串. 思路 :设串S的反串为S‘那么strlen(S) - LCS(S, S')就是本问题的答案. 如: S(原串)       A   b  3  b  d S1(倒序串)   d   b  3  b  A LCS                   b  3  b         所以,有3个字符已经配对,不用添加

LIS(最长递增子序列)和LCS(最长公共子序列)的总结

LIS(最长递增子序列)和LCS(最长公共子序列)的总结 最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2) s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1; s1[i - 1] != s2[j - 1], dp[