POJ2891 Strange Way to Express Integers (扩展欧几里德)

本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia

题目大意

求解一组同余方程
x ≡ r1 (mod a1)
x ≡ r2 (mod a2)
x ≡ r3 (mod a3)
......
x ≡ rk (mod ak)
的解x(a1,a2,a3,.....ak 并不一定互质)。如果不存在则输出-1.

输入格式

有多组数据,每组数组第一行为k,后面有k行,每行两个数,代表ai,ri。

输出格式

每一行对应每一个询问的解x。

样例输入

2
8 7
11 9

样例输出

31

分析

看到这一题,可以发现好像问的就是中国剩余定理的问题,可是题目中a并不互质,无法用中国剩余定理来解决。不过我们可以从扩展欧几里德算法入手。

先来分析规模小一点的。

对于一组同余方程

\(\begin {cases} x \mod a_1=r_1\\ x\mod a_2=r_2\end{cases}\to\begin{cases}k_1*a_1+r_1=x\\ k_2* a_2+r_2=x\end {cases}\)

我们可以上下两式相减得出

$ k_1* a_1-k_2* a_2=r_2-r_1$

我们可以发现,这个式子可以用扩展欧几里德来求解。于是我们求出了\(k_1\)
便可以将其带入原来的式子,求出\(x=k_1*a_1+r_1\)。这是两个方程的求解,面对多个方程,我们可以这样做:
假设我们刚才求出的是\(x_1\),而为了求出满足三个方程的解\(x_2\)我们可以得到这样的式子
\(\begin {cases} x_2\mod lcm(a_1,a_2)=x_1\\ x_2\mod a_3=r_3\end{cases}\)
证明:

\(x_2=k_3*lcm(a_1,a_2)+x_1\) ,因为\(k_3*lcm(a_1,a_2)\)这一块肯定能整除\(a_1\)\(a_2\),所以肯定会剩下一个\(c_1\),而\(c_1\)恰好满足前面的方程

用同样的方法,我们可以求出满足所有式子的解。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 10000+10
#define abs(a) a>0?a:-a
using namespace std;
long long e_gcd(long long a,long long b,long long& x,long long& y)
{if(!b){x=1;y=0;return a;}long long ans=e_gcd(b,a%b,x,y);long long tmp=x;x=y;y=tmp-a/b*y;return ans;
}
long long a1,a2,b1,b2,x,y,gcd,t,c;
int main()
{while(scanf("%lld",&t)!=EOF){scanf("%lld%lld",&a1,&b1);int flag=0;if(t==1) printf("%lld\n",b1);else{for(int i=2;i<=t;i++){   scanf("%lld%lld",&a2,&b2);if(flag)  continue;gcd=e_gcd(a1,a2,x,y);if((b2-b1)%gcd!=0) {flag=1;}x*=(b2-b1)/gcd;x%=a2/gcd;if(x<0) x+=abs(a2/gcd);c=a1*x+b1;a1=a1/gcd*a2; b1=c;}}if(flag==1) {printf("-1\n");continue;}      printf("%lld\n",c);}return 0;
}

转载于:https://www.cnblogs.com/yangyaojia/p/6421628.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js中的回调函数的理解和使用方法

一. 回调函数的作用 js代码会至上而下一条线执行下去&#xff0c;但是有时候我们需要等到一个操作结束之后再进行下一个操作&#xff0c;这时候就需要用到回调函数。 二. 回调函数的解释 因为函数实际上是一种对象&#xff0c;它可以存储在变量中&#xff0c;通过参数传递给另一…

C语言中的小数取整和四舍五入

将小数直接抹掉的取整1自动类型转换 例如 &#xff1a;#include <stdio.h> main() {int a;a2.7;printf("a %d",a); } // a 22强制类型转换例如&#xff1a;#include <stdio.h> main() {printf("%d",(int)3.75); //输出结果为 …

sql exist 优化查询时间

1.非exist&#xff0c;查询需要20多秒 2.使用exist后 3.表连接也能优化 转载于:https://www.cnblogs.com/alamZ/p/6423166.html

1-4 数组元素的区间删除 (20 分)

题目&#xff1a; 给定一个顺序存储的线性表&#xff0c;请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储&#xff0c;并且相对位置不能改变。 函数接口定义&#xff1a; int Delete( int A[], int L, int minA, int maxA );其中A是整型数…

LightOJ - 1245 Harmonic Number (II) 求同值区间的和

题目大意&#xff1a;对下列代码进行优化 long long H( int n ) { long long res 0; for( int i 1; i < n; i ) res res n / i; return res;} 题目思路&#xff1a;为了避免超时&#xff0c;要想办法进行优化 以9为例&#xff1a; 9/1 9 9/2 4 9/3 3…

1-9 最长连续递增子序列 (20 分)

给定一个顺序存储的线性表&#xff0c;请设计一个算法查找该线性表中最长的连续递增子序列。例如&#xff0c;(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。 输入格式: 输入第1行给出正整数n&#xff08;≤10 ​5 ​​ &#xff09;&#xff1b;第2行给出n个整数&am…

1-1 顺序表操作集 (20 分)

本题要求实现顺序表的操作集。 函数接口定义&#xff1a; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );其中List结构定义如下&#xff1a; typedef int Position; t…

1-5 线性表元素的区间删除 (20 分)

题目&#xff1a; 给定一个顺序存储的线性表&#xff0c;请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储&#xff0c;并且相对位置不能改变。 函数接口定义&#xff1a; List Delete( List L, ElementType minD, ElementType maxD );其…

Unknown storage engine 'InnoDB'

报错情况&#xff1a;在导入数据时候发现找不到InnoDB这个错误&#xff0c;之前查看博客时候明白了IsAsm数据库和InnoDB这两个的区别了。 解决方案&#xff1a; 尝试一&#xff1a;将my.ini配置文件的isasm改成InnoDB。这个是之前参考博客完成。但是这个没有奏效。 尝试二&…

2-10 [搞定!]出栈序列的合法性 (20 分)

给定一个最大容量为 M 的堆栈&#xff0c;将 N 个数字按 1, 2, 3, …, N 的顺序入栈&#xff0c;允许按任何顺序出栈&#xff0c;则哪些数字序列是不可能得到的&#xff1f;例如给定 M5、N7&#xff0c;则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 }&#xff0c;但不可能得到{ 3, 2…

Java中有关Null的9件事

对于Java程序员来说&#xff0c;null是令人头痛的东西。时常会受到空指针异常&#xff08;NPE&#xff09;的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢&#xff1f;null出现有一段时间了&#xff0c;并且我认为Java发明者知道null与它解决的问题…

3-5 单链表分段逆转 (20 分)

给定一个带头结点的单链表和一个整数K&#xff0c;要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K3&#xff0c;你需要将链表改造成 3→2→1→6→5→4&#xff1b;如果 K4&#xff0c;则应该得到 4→3→2→1→5→6。 函数接口定义&#xff1a; v…

studio快捷键

转载于:https://www.cnblogs.com/hoobey/p/6431027.html

c语言编写单片机技巧

1. c语言和汇编语言在开发单片机时各有哪些优缺点&#xff1f; 答&#xff1a;汇编语言是一种用文字助记符来表示机器指令的符号语言&#xff0c;是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的cpu&#xff0c;其汇编语言可能有所差异&#xf…

7-1 叶节点求和 (30 分)

对给定的有N个节点&#xff08;N>0&#xff09;的二叉树&#xff0c;求叶节点元素之和。 输入格式: 第一行是一个非负整数N&#xff0c;表示有N个节点 第二行是一个整数k&#xff0c;是树根的元素值 接下来有N-1行&#xff0c;每行是一个新节点&#xff0c;格式为 r d e …

Docker的学习笔记(开发的技术分享转发)

我的Docker学习记录一、安装dockeryum install -y docker-io二、使用docker1、下载镜像docker pull <image>2、查询镜像docker search <image> 3、从镜像运行容器docker run -it --name <name> <image> /bin/bash4、后台运行docker run -itd --name &l…

PhoneUtils

import java.util.regex.Matcher; import java.util.regex.Pattern;public class PhoneUtils {/*** param phoneNo* 加星号过的电话号码*/public static String dealPhoneNo(String phoneNo) {return phoneNo.substring(0, 3) "****" phoneNo.substring…

批量更新

这是最基本的批量更新。我使用的时候还不如逐条。 这好像还是官方的批量更新&#xff0c;反正不咋地。 ///批量更新&#xff0c;效率太低&#xff0c;不如逐条更新static void Update(){SqlDataAdapter sda new SqlDataAdapter("select PID,FMAddress,MeanValue1,StatsVa…

java实例练习——基于TCP/IP协议的多客户端通信

先说一下大概的思路&#xff1a; 应用多线程来实现服务器与多客户端之间的通信 1、服务器端创建ServerSocket&#xff0c;循环调用accept&#xff08;&#xff09;等待客户端连接&#xff1b; 2、客户端创建一个Socket并请求与服务器端连接&#xff1b; 3、服务器端接受客户端请…

windows资源管理器已停止工作后,使用命令提示窗口拷贝文件和运行exe程序

电脑异常现象&#xff1a; 需要从优盘拷贝NetAssist.exe软件至电脑进行运行&#xff0c;发现双击无法打开我的电脑和文件夹&#xff0c;点击提示的重新启动程序问题后仍存在&#xff0c;重启电脑、关机再开机该问题依然存在。插入优盘后可以识别到&#xff0c;但无法打开优盘&…