首页 > 编程语言 >拓展欧几里得算法

拓展欧几里得算法

时间:2023-05-20 22:15:02浏览次数:47  
标签:int 欧几里得 拓展 leq 算法 ax 回文 bmod define

1.拓展欧的用处:

求解方程 \(ax + by == m\) 的一组解

2.拓展欧的一般性条件:

对于方程\(ax + by = m\),当 \(gcd(a, b)\) 是 m 的整数倍时必定有解

3.求解:

设\(d = gcd(a, b)\),则特解为 \( \begin{cases} x = x_0 + \frac{d}{m} \quad\\ y = y_0 + \frac{d}{m} \quad\\ \end{cases} \)

4.应用方法:

求解一次同余方程 \(ax≡b(mod m)\)
转化:\(ax = km + b\)
令 \(k^, = -k\)
即得:\(ax + k^,m = b\)

5.例题:

Lunatic Never Content

题目描述

现在有一个数组 \(a\),和 \(n\) 个非负整数,定义 \(f(a,x)=[a_1\bmod x,a_2\bmod x,\dots,a_n\bmod x]\),其中 \(x\) 为正整数。现要你找到最大的 \(x\),使得 \(f(a,x)\) 是回文的。

这里,\(a \bmod x\) 的含义为 \(a\) 除以 \(x\) 得到的余数。

我们认为一个数组是回文的,当且仅当从前往后读得到的结果和从后往前读得到的结果完全相同。换句话说,一个长度为 \(n\) 的数组 \(a\) 是回文的,当且仅当 \(\forall 1\leq i \leq n\),有 \(a_i=a_{n-i+1}\)。

输入格式

第一行一个整数 \(t(1 \leq t \leq 10^5)\),代表测试数据的组数。

对于每一组测试数据:

第一行一个整数 \(n(1 \leq n \leq 10^5)\),代表数组 \(a\) 的长度。

第二行共 \(n\) 个数,以空格隔开,对于 \(1\leq i \leq n\),第 \(i\) 个数代表 \(a_i\)。

数据保证 \(\sum n \leq 10^5\)。

输出格式

对于每一组测试用例,输出最大的 \(x\) ,使得 \(f(a,x)\) 是回文的。如果 \(x\) 可以为无穷大,输出 \(0\) 来代替。

样例 #1

样例输入 #1

4
2
1 2
8
3 0 1 2 0 3 2 1
1
0
3
100 1 1000000000

样例输出 #1

1
2
0
999999900

分析:

要实现回文位置的同余,即\(a≡b(mod x)\),要求$ x 则当且仅当 x 为 gcd(a, b)$的整数倍时才满足

实现:

#include <bits/stdc++.h>
using namespace std;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 2000010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
int T;
int n;
int a[N];
int res;
void solve()
{
    res = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 1; i <= n / 2; i++)
    {
        int tmp = abs(a[i] - a[n - i + 1]);
        res = __gcd(res, tmp);
    }

    cout << res << endl;
}
signed main()
{
    FAST;
    T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:int,欧几里得,拓展,leq,算法,ax,回文,bmod,define
From: https://www.cnblogs.com/Aidan347/p/17417880.html

相关文章

  • 【代码随想录算法训练营第一天】704. 二分查找、27. 移除元素
    Day1-数组Leetcode704二分查找初解已经不记得二分查找了,遍历找O(n)其实也过了,只是借此复习一下二分,确实快很多。二分的前提条件题目里也都明示了:无重复,(从小到大)排序。我没有用到这个条件,自然时间复杂度高于最优解。看完解答我再看了一眼题目的标题,才知道是考BinarySearch嗯......
  • C# 版本 最少金币问题 动态规划 算法
    @[TOC](C#版本最少金币问题动态规划算法)<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">题目这是一道经典算法题,题目如下:题目:有面值为2元,5元,7元面值的硬币,买一本27元的书,用最少的硬币组合刚好付清,问题1:需要几枚硬币。问题2:这几枚硬币都是什么?<......
  • 算法学习笔记合集
    字符串哈希:哈希学习笔记KMP:KMP学习笔记图论分层图最短路:分层图最短路LCA:P3379最近公共祖先模板数据结构线段树:线段树学习笔记ST表:P3865ST表树状数组:P3374树状数组1DP树上背包:P2014选课(树上背包)杂项搜索:搜索学习笔记离散化:离散化学习笔记......
  • 最短路径算法
    最短路径问题这是一类最基本的图论问题,给定一个图,求从某一个源节点到某一个目的节点的最短路径。比较常见的算法有dijkstra,floyd,SPFA。在开始之前我们先说一说“松弛”这个词。在描述最短路径算法的时候,我们经常可以看到松弛(relaxtion)一词,通常来说,所有的最短路径算法都......
  • 算法学习day25回溯part02-216、17
    packageLeetCode.backtrackpart02;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;/***216.组合总和III*找出所有相加之和为n的k个数的组合,且满足下列条件:*只使用数字1到9*每个数字最多使用一次*返回所有可能的有效......
  • 《数据结构与算法》之十大基础排序算法
    一.冒泡排序什么是冒泡排序?冒泡排序是一种交换排序,它的思路就是在待排序的数据中,两两比较相邻元素的大小,看是否满足大小顺序的要求,如果满足则不动,如果不满足则让它们互换。然后继续与下一个相邻元素的比较,一直到一次遍历完成。一次遍历的过程就被成为一次冒泡,一次冒泡的结束至......
  • 代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项
    【参考链接】20.有效的括号【注意】1.括号匹配是使用栈解决的经典问题。2.这个命令最后进入a目录,系统是如何知道进入了a目录呢,这就是栈的应用(其实可以出一道相应的面试题了)。3.有三种不匹配的情况,第一种情况,字符串里左方向的括号多余了;第二种情况,括号没有多余,但是括号的......
  • 基于Graph-Cut算法的彩色图像深度信息提取matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要Graphcuts是一种十分有用和流行的能量优化算法,在图像处理领域普遍应用于前后背景分割(Imagesegmentation)、立体视觉(stereovision)、抠图(Imagematting)等,目前在医学图像领域应用较多。GraphCut(图形切割)应用于......
  • 基于Graph-Cut算法的彩色图像深度信息提取matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       Graphcuts是一种十分有用和流行的能量优化算法,在图像处理领域普遍应用于前后背景分割(Imagesegmentation)、立体视觉(stereovision)、抠图(Imagematting)等,目前在医学图像领域应用较......
  • m基于低复杂度高性能BP译码算法的LDPC编译码性能matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现简单,易于进行理论分......