POJ2891:Strange Way to Express Integers(解一元线性同余方程组)
写一下自己的理解,下面附上转载的:
若a==b(modk);//这里的==指的是同余,我用=表示相等(a%k=b)
a-b=kt(t为整数)
以前理解的错误思想:
以前认为上面的形式+(a-tb=k)也是成立的,今天一想随便就能举出一个反例11==5(mod3)
同样是求这个东西。。
X mod m1=r1
X mod m2=r2
...
...
...
X mod mn=rn 首先,我们看两个式子的情况
X mod m1=r1……………………………………………………………(1)
X mod m2=r2……………………………………………………………(2)
则有
X=m1*k1+r1………………………………………………………………(*)
X=m2*k2+r2
那么 m1*k1+r1=m2*k2+r2
整理,得
m1*k1-m2*k2=r2-r1
令(a,b,x,y,m)=(m1,m2,k1,k2,r2-r1),原式变成
ax+by=m
熟悉吧? 此时,因为GCD(a,b)=1不一定成立,GCD(a,b) | m 也就不一定成立。所以应该先判 若 GCD(a,b) | m 不成立,则!!!方程无解!!!。(即合并的这两个方程组不可能相等,即没有同解X)
否则,继续往下。 解出(x,y),将k1=x反代回(*),得到X。//解出的一组特解(x,y)代入是(1)(2)两个方程所得X是相等的。
于是X就是这两个方程的一个特解,通解就是 X'=X+k*LCM(m1,m2)//(特解为X=x*(c/d)*m1+r1;同解X'=X+(m2/d)*m1*k,=X+lcm(m1,m2)*k)
这个式子再一变形,得 X' mod LCM(m1,m2)=X
这个方程一出来,说明我们实现了(1)(2)两个方程的合并。 转载: /**********************一般模线性方程组***********************/ 同样是求这个东西。。
X mod m1=r1
X mod m2=r2
...
...
...
X mod mn=rn 首先,我们看两个式子的情况
X mod m1=r1……………………………………………………………()
X mod m2=r2……………………………………………………………()
则有
X=m1*k1+r1………………………………………………………………(*)
X=m2*k2+r2
那么 m1*k1+r1=m2*k2+r2
整理,得
m1*k1-m2*k2=r2-r1
令(a,b,x,y,m)=(m1,m2,k1,k2,r2-r1),原式变成
ax+by=m
熟悉吧? 此时,因为GCD(a,b)=1不一定成立,GCD(a,b) | m 也就不一定成立。所以应该先判 若 GCD(a,b) | m 不成立,则!!!方程无解!!!。
否则,继续往下。 解出(x,y),将k1=x反代回(*),得到X。
于是X就是这两个方程的一个特解,通解就是 X'=X+k*LCM(m1,m2)
这个式子再一变形,得 X' mod LCM(m1,m2)=X
这个方程一出来,说明我们实现了()()两个方程的合并。
令 M=LCM(m1,m2),R=r2-r1
就可将合并后的方程记为 X mod M = R。 然后,扩展到n个方程。
用合并后的方程再来和其他的方程按这样的方式进行合并,最后就能只剩下一个方程 X mod M=R,其中 M=LCM(m1,m2,...,mn)。
那么,X便是原模线性方程组的一个特解,通解为 X'=X+k*M。 如果,要得到X的最小正整数解,就还是原来那个方法: X%=M;
if (X<) X+=M; 这么一来~~大功告成~~
PS:2015.1.21题目解析:这个算法我没有搞懂,以后只能靠模版了,,囧!!!(希望看完中国剩余定理后能对这里有一个重新的认识)
PS:1.22终于完全搞懂了,好开心,重新解释一下。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
long long a,b,c,n,d;
long long X,Y;
void extend(long long A,long long B,long long &d,long long &x1,long long &y1)
{
if(B==)//犯了一个低级失误如果写成long long d的话函数的值传回到主函数
{
x1=;
y1=;
d=A;
return ;
}
extend(B,A%B,d,x1,y1);
long long temp=x1;
x1=y1;
y1=temp-(A/B)*y1;
return ;
}
int main()
{
long long a1,r1,a2,r2,i,j;
while(scanf("%lld",&n)!=EOF)
{
bool ifhave=true;
scanf("%lld%lld",&a1,&r1);
for(i=; i<=n; i++)
{
scanf("%lld%lld",&a2,&r2);
a=a1;
b=a2;
c=r2-r1;
extend(a,b,d,X,Y);
if(c%d)
{
ifhave=false;
break;
}
long long t=b/d;
X=(X*(c/d)%t+t)%t;//最小解
X=a1*X+r1;//带入原方程求出一个特解X,这个特解同时满足合并的两个方程组,那么通解为X‘=X+(a2/d)*a1*k,即X'=X+lcm(a1,a2)*k;->X'mod lcm(a1,a2)=X;
//printf("X===%lld\n",X);
a1=a1*(a2/d);// 即lcm(a1,a2)
r1=X; //上面证明即为两个方程组的合并
}
for(j=i+; j<=n; j++)
{
scanf("%lld%lld",&a2,&r2);
}
if(!ifhave)
{
printf("-1\n");
continue;
}
printf("%lld\n",X);
}
return ;
}
POJ2891:Strange Way to Express Integers(解一元线性同余方程组)的更多相关文章
- 【POJ 2891】Strange Way to Express Integers(一元线性同余方程组求解)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
- HDU1573:X问题(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题 ...
- HDU3579:Hello Kiki(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...
- 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)
0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...
- HDU1573 X问题【一元线性同余方程组】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=1573 题目大意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X ...
- POJ2891——Strange Way to Express Integers(模线性方程组)
Strange Way to Express Integers DescriptionElina is reading a book written by Rujia Liu, which intro ...
- POJ2891 Strange Way to Express Integers
题意 Language:Default Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total S ...
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- POJ2891 - Strange Way to Express Integers(模线性方程组)
题目大意 求最小整数x,满足x≡a[i](mod m[i])(没有保证所有m[i]两两互质) 题解 中国剩余定理显然不行....只能用方程组两两合并的方法求出最终的解,刘汝佳黑书P230有讲~~具体证 ...
随机推荐
- VC++ 使用MSSOAP访问WebService天气服务(客户端开发)
绪论 本文介绍使用VC++编程实现访问天气Web服务的简单实例(例子来源于网络). Web天气服务 http://www.webxml.com.cn/WebServices/WeatherWebSer ...
- mysql数据库中,通过mysqladmin工具,创建数据库
需求描述: 今天接触到了mysqladmin工具,主要是一个客户端工具,用来管理mysql server的 可以通过mysqladmin直接创建数据库,而不需要登录到mysql控制台中,在此记录下. ...
- 我的javascript心跳机
li { list-style: none!important; padding:0; } .list_num{ list-style-type:decimal; } .list_inline{ ma ...
- Trie树(字典树)(1)
Trie树.又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构. Trie树与二叉搜索树不同,键不是直接保存在节点中,而是由节点在树中的位置决定. 一个节点的全部子孙都有同样的前缀(pr ...
- C51中遇到一个有关data与xdata的问题,已解决
环境: 我在某个C文件定义了一个结构体变量,然后该变量仅仅是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果运行时怎么也达不到要的效果. struct BE ...
- Python 中文乱码
1.首行添加 # -*- coding:gb2312 -*- # -*- coding:utf-8 -*- 2.PyCharm设置 在File->setting->File Encodin ...
- PHP代码审计 -1.SQL注入总结
0x01 背景 最近在学习PHP代码审计,这里做一个SQL注入总结,是对自己学习知识的总结,也是为自己学习的笔记,方便自己反复翻阅. 0x02 PHP代码审计-SQL注入 挖掘SQL ...
- Linux curl 命令
curl is a tool to transfer data from or to a server, using one of the supported protocols ( http ,ht ...
- java基础---->数字签名算法的介绍
数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.关于数字签名的介绍,可以参见百度百科:http://baike.baidu.c ...
- linux时间与Windows时间不一致的解决
一.首先要弄清几个概念:1. “系统时间”与“硬件时间” 系统时间: 一般说来就是我们执行 date命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间. ...