当前位置: 首页 > article >正文

P1516 青蛙的约会(exgcd)

一些前置知识:

1.扩展欧几里得算法:

                                         ax+by=gcd(a,b)

方程一个可行的解(x1,y1)求法:

int exgcd(int a,int b,int &x,int &y)
{
    if(!b){
        x=1,y=0; return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

 2.由ax+by=gcd(a,b) 的解推出 ax+by=n  的一个可行解(x0,y0):

3.由ax+by=n   的解(x0,y0)推其通解:

4.在通解中找最小正整数解的小技巧:

   设y=t*x+z(t、z为常数,x为变量) ,则y 的最小正整数解为:

y`=(z%t+t)%t;

正式进入题解:

代码:

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

int exgcd(int a,int b,int &x,int &y) 
{
	if(!b)
	{
		x=1,y=0; return a;
	}
	int d=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}

signed main()
{
	int x,y,m,n,l,x0,y0; 
	cin>>x>>y>>m>>n>>l;
	int a=m-n,b=y-x;
	if(a<0) a=-a,b=-b;//注意gcd仅仅对正整数有意义,故要将系数化为正数
	int d=exgcd(a,l,x0,y0);//扩欧
	if(b%d) cout<<"Impossible";//判断原方程是否有解
	else {
		int k=l/d;
	cout<<(x0*(b/d)%k+k)%k;//求最小正整数解
	}
	
}

24/8/29


http://www.kler.cn/a/282159.html

相关文章:

  • 操作系统
  • 最火视频素材去哪里找?热门的视频素材网站库分享给你
  • 工业软件架构1:(QT和C++实现)
  • LLama3技术报告笔记(垂直能力)
  • js逆向——异步栈分析(上)
  • Faiss入门心得---向量数据库Faiss的搭建与使用
  • C#/WinForm实现炸弹人游戏
  • PaddleNLP 3.0 支持大语言模型开发
  • 新手学习打怪之编译安装LAMP和LNMP
  • 力扣850.矩形面积 II
  • Python的requests库详细介绍
  • 【持续更新】Mχ Plaayer Pro 1.86.0安卓知名播放器最新免费高级修改版
  • 深入浅出LangChain:从模型调用到Agents开发的全流程指南
  • 【React】跨域问题详解及解决方案
  • 手机三网状态实时查询分享
  • 软件设计模式 - 汇总
  • MyBatis的学习————下篇
  • SQL部分一
  • 【Docker】Docker学习01 | 什么是docker?
  • 【给女朋友讲C++】C++的调试之gdb