2023.7.26(同余方程的通解与特解)

这篇具有很好参考价值的文章主要介绍了2023.7.26(同余方程的通解与特解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Water(扩欧求特解与通解)
题意:给容量分别为A与B的水杯,问确切喝到C水的最小操作次数
有4种操作:选一杯全喝,选一杯全部倒掉,选一杯装满,将一杯的水尽量倒到另一杯中
思路:只有Ax+By=C有解时才能确切喝到X水
裴蜀定理:如果a、b是整数,那么一定存在整数x、y使得ax+by=k*gcd(a,b)。
思路:要求x,y的特解,可以使用exgcd的板子,令c = k * gcd(A, B)则Ax + By = c;exgcd求出来的是k = 1时的特解
只要将x *= c / gcd(A, B), y *= c / gcd(A, B);此时x和y就是方程Ax + By = c的特解
这里有一个步长的概念对于x他的步长是 B / gcd(A, B), 对于y他的步长是 A / gcd(A, B)
要求最小整数解,只需要把x除上他的步长就能知道x要走多少步才能最接近0,再把x -= 步长 * 步数就可以让x最接近0,然
后在对原点附近的 (x​+t⋅步长,y​−t⋅步长)求min⁡即可得到最小整数解

#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
typedef pair<int, int> pr;

#define int long long
#define ll long long
#define fr(i,l,r) for(int i=l;i<=r;i++)
#define ufr(i,n,z) for(int i = n;i >= z; i--)
#define pb(x) push_back(x)
#define all(a) a.begin(),a.end()
#define fi first
#define se second

const int N = 1e6 + 10;
const int mod = 998244353, inf = LONG_LONG_MAX;
int dx[] = { 0,0,-1,0,1 }, dy[] = { 0,-1,0,1,0 };
int n, m;

int a[N];
int gcd(int a, int b) {         //辗转相除
    return !b ? a : gcd(b, a % b);
}
int exgcd(int a, int b, int& x, int& y)       //扩欧板子
{
    if (b == 0) {
        x = 1; y = 0;
        return a;  //到达递归边界开始向上一层返回
    }
    ll d = exgcd(b, a % b, y, x);
    y -= (a / b) * x;
    return d;
}
void solve()
{
    int a, b, c;
    cin >> a >> b >> c;
    if (c % gcd(a, b) != 0) {
        cout << -1 << '\n';                  //无解
    }
    else {
        int x, y;
        int d = exgcd(a, b, x, y);
        x *= c / d; y *= c / d;                    //特解(除去最大公约数乘上C)
        int dx = b / d; int dy = a / d;
        y += (x / dx) * dy;
        x -= (x / dx) * dx;       //最小整数解,只需要把x除上他的步长就能知道x要走多少步才能最接近0
        int ans = inf;
        fr(i, -10, 10) {
            int xx = x + dx * i; int yy = y - dy * i;           //通解
            ans = min(ans, max((xx + yy) << 1, (abs(xx - yy) << 1) - 1));
        }
        cout << ans << '\n';
    }
}

signed main()
{
    //    ios;
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}


P1082 [NOIP2012 提高组] 同余方程
题意:求ax->1(mod b)的最小整数解,输入数据保证一定有解。
转变为ax=1+by,移项ax-by=1,

扩欧求的特解x/d,y/d,

通解x/d-i*(x/d/b/d)*b/d->x/d-x/b*(b/d)->x/d-i*x/d
 文章来源地址https://www.toymoban.com/news/detail-607669.html

#include<iostream>
#define int long long
using namespace std;
int exgcd(int a, int b, int& x, int& y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= (a / b) * x;
    return d;
}
signed main(){
    int a, b;
    int x, y;
    cin >> a >> b;
    exgcd(a, b, x, y);
    cout << (x % b + b) % b << '\n';
    return 0;
}

到了这里,关于2023.7.26(同余方程的通解与特解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 考研二阶常系数非齐次微分方程式特解(微分算子法)

    y \\\" + p y ′ + q y = f ( x ) y^{\\\"}+py^{\\\'}+qy=f(x) y \\\" + p y ′ + q y = f ( x ) ⇒ y ∗ = f ( x ) F ( D ) = f ( x ) D 2 + p D + q Rightarrow y^{*}=frac{f(x)}{F(D)}=frac{f(x)}{D^2+pD+q} ⇒ y ∗ = F ( D ) f ( x ) ​ = D 2 + p D + q f ( x ) ​ 1. f ( x ) = e k x ( 所有的 D 都替换成 k ) f(x)=e^{kx}(所有的D都替换成k) f ( x ) = e k x ( 所有

    2024年02月13日
    浏览(34)
  • 基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

    正常的求解微分方程的MATLAB格式如下: 如果需要指明自变量,则如下: 格式中的 fi 既可以描述微分方程,又可以描述 初始条件 或 边界条件 。 描述微分方程的MATLAB格式为: D4y=7 ; 描述条件的MATLAB格式为: D2y(2)=3 ; 输入信号u(t)如下: 求解如下微分方程的通解 解: 此题需

    2023年04月09日
    浏览(45)
  • hnu计算机与人工智能概论5.26(方程求根)

    第1关:用暴力搜索法求方程的近似根  本关任务:用暴力搜索法求 f(x)=x3−x−1 在[-10,10]之间的近似根。已知f(-10)0,f(10)0,画图可知函数在[-10,10]区间有且仅有一个根。要求近似根带入函数f(x)之后,函数值与0之间的误差在 10−6 之内,请保留4位小数输出该根值,并输出搜寻次

    2024年02月03日
    浏览(42)
  • 2023/10/26MySQL学习

    事务 询问当前是什么提交方式 1代表默认提交,0代表手动提交 将事务设为手动提交 将事务设置为手动提交后,mysql语句只会执行,但不会对原本表中数据进行更改, 只有执行以下两个语句之一,才会继续进行 commit完成原本操作,更改数据 rollback取消原来事务,不会进行任何更改 如果

    2024年02月08日
    浏览(41)
  • 2023-8-26 字符串哈希

    题目链接:字符串哈希

    2024年02月11日
    浏览(34)
  • 2023-08-26力扣每日一题

    链接: 228. 汇总区间 题意: 升序数组找连续区间 解: 简单遍历题 实际代码: 限制: 0 = nums.length = 20 -231 = nums[i] = 231 - 1 nums 中的所有值都 互不相同 nums 按升序排列

    2024年02月11日
    浏览(33)
  • 英语练习第三天-2023.03.26

    目录 学习目标: 学习内容: 学习时间: 学习产出: 日常对话 hello baby good morning let\\\'s to meet you Hello! Good morning to you too. I\\\'m not a human baby, but I\\\'m an AI language model called ChatGPT. Nice to meet you! How may I assist you today? Yes,my English level is be One and can you give me A five comment,web vegetable?To。

    2023年04月08日
    浏览(33)
  • 每日C++小程序小研究·3·2023.7.26

    今日研究c++简单的设计模式;         单例模式是一种保证一个类只有一个实例的设计模式。         常见的实现方式有两种:饿汉式和懒汉式。         饿汉式:在类初始化时就已经创建了实例;         懒汉式:则在需要时才创建实例。         单例模式可

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包