您的位置:首页 > 其它

[POJ2891] Strange Way to Express Integers

2016-12-27 16:55 204 查看

题目描述

FJ正在读佳佳写的一本书,书中描述一种表示非负整数的方法:选择k个不同的正整数a1,a2,…,ak,对于某个整数m分别对ai求余对应整数ri,如果适当选择a1,a2,…,ak,那么整数m可由整数对组合(ai,ri)唯一确定。

输入格式

输入包含多组测试数据,对于每组测试数据:第一行包含一个整数k;第2到k+1行每行包含两个整数ai,ri。

输出格式

对于每组测试数据输出对应的非负整数m的值,若有多个m,则输出最小的一个;若无解,则输出-1。

样例数据

样例输入

2

8 7

11 9

样例输出

31

说明

All integers in the input and the output are non-negative and can be represented by 64-bit integral types.

题目分析

标准欧几里得解线性方程组,要注意的就是。。无解情况退出前要读完所有当组数据。。

欧几里得解线性方程组

源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const long long Get_Int() {
long long num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
long long Exgcd(long long a,long long b,long long &x,long long &y) {
if(b==0) {
x=1;
y=0;
return a;
}
long long ans=Exgcd(b,a%b,x,y),tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
long long n;
long long Solve() {
long long a1=Get_Int(),r1=Get_Int();
for(int i=2; i<=n; i++) {
long long a2=Get_Int(),r2=Get_Int(),a=a1,b=a2,c=r2-r1,x0,y0;
long long gcd=Exgcd(a,b,x0,y0);
if(c%gcd) { //无解
for(int j=i+1; j<=n; j++)Get_Int(),Get_Int();
return -1;
}
long long b1=b/gcd;
x0=(x0*(c/gcd)%b1+b1)%b1;
r1+=a1*x0; //带入原方程组的第一个
a1*=(a2/gcd);
}
return r1;
}
int main() {
while(scanf("%lld",&n)!=EOF)printf("%lld\n",Solve());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息