POJ2891 Strange Way to Express Integers 一元线性同余方程组
2015-06-05 11:25
375 查看
题目连接:http://poj.org/problem?id=2891
题目大意:有一种表示非负整数的方法:选择k个不同的正整数a1,a2,...,ak,对于某个整数m分别对ai求余,对应余数为ri,如果只当选择a1,a2,...,ak,那么整数m可有整数对(ai,ri)唯一表示。现在已知整数对(ai,ri),让确定出唯一的整数m.
分析:典型的解同余方程组的问题。
实现代码如下:
题目大意:有一种表示非负整数的方法:选择k个不同的正整数a1,a2,...,ak,对于某个整数m分别对ai求余,对应余数为ri,如果只当选择a1,a2,...,ak,那么整数m可有整数对(ai,ri)唯一表示。现在已知整数对(ai,ri),让确定出唯一的整数m.
分析:典型的解同余方程组的问题。
实现代码如下:
#include <iostream> #include <cstdio> #include <cstdlib> typedef long long LL; LL a,b,c,d,a1,r1,a2,r2,x0,y0; void exgcd(LL a,LL b,LL &d,LL &x,LL &y) { if(!b) { x=1,y=0,d=a; return ; } /* else { exgcd(b,a%b,d,y,x),y-=x*(a/b); } */ else { exgcd(b,a%b,d,x,y); LL temp=x; x=y; y=temp-(a/b)*y; } } int solve(int n) {//函数返回值即为方程的解,若方程无解,则返回-1 bool ifhave=1; scanf("%lld%lld",&a1,&r1); for(int i=1;i<n;i++) { scanf("%lld%lld",&a2,&r2); a=a1,b=a2,c=r2-r1; exgcd(a,b,d,x0,y0); if(c%d) ifhave=0; LL t=b/d; x0=(x0*(c/d)%t+t)%t; r1=a1*x0+r1; a1=a1*(a2/d); } if(!ifhave) r1=-1; return r1; } int main() { int n; while(scanf("%d",&n)!=-1) { solve(n); printf("%lld\n",r1); } return 0; }
相关文章推荐
- 详解SQL Server连接(内连接、外连接、交叉连接)
- 从今天开始,坚持写博客
- p124 42
- hdu 1133 Buy the Ticket
- 简单的thinkPHP3.2运行实例。
- Linux虚拟机中找不到光驱怎么办?
- jQuery插件EnPlaceholder实现输入框提示文字
- QT QString字符串转16进制串口发送数据
- Listview部分源码分析
- 配置VIM语法高亮及自动缩进
- Objective-C Runtime 运行时之二:成员变量与属性
- oracle错误(一) ORA-各种常见java.sql.SQLException小结
- Android开发PopupWindow.showAtLocation用法
- 安装配置sock5代理
- 数组顺序存储二叉树
- iOS动画效果整理
- Android中的WebView详细介绍
- 2015.6.5 qt学习笔记 accept()概念
- 客户需求分析
- Innodb事务隔离级别