博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2891 Strange Way to Express Integers
阅读量:5870 次
发布时间:2019-06-19

本文共 2276 字,大约阅读时间需要 7 分钟。

Strange Way to Express Integers
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 17963   Accepted: 6050

Description

 

Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is described as following:

 

Choose k different positive integers a1a2…, ak. For some non-negative m, divide it by every ai (1 ≤ i ≤ k) to find the remainder ri. If a1a2, …, ak are properly chosen, m can be determined, then the pairs (airi) can be used to express m.

“It is easy to calculate the pairs from m, ” said Elina. “But how can I find m from the pairs?”

Since Elina is new to programming, this problem is too difficult for her. Can you help her?

Input

The input contains multiple test cases. Each test cases consists of some lines.

  • Line 1: Contains the integer k.
  • Lines 2 ~ k + 1: Each contains a pair of integers airi (1 ≤ i ≤ k).

 

Output

Output the non-negative integer m on a separate line for each test case. If there are multiple possible values, output the smallest one. If there are no possible values, output -1.

 

Sample Input

28 711 9

Sample Output

31

Hint

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

Source

, Static
 
题意
给出$a_i,r_i$
求$x\equiv r_{i}\left( mod\ a_{i}\right)$
其中$a_i$不互质
 
 
扩展CRT的应用,算是裸题吧
第一次一遍写对扩欧好感动啊。。。
 
#include
#include
#define LL long long using namespace std;const LL MAXN=1e6+10;LL K,C[MAXN],M[MAXN],x,y;LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b);}LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){x=1,y=0;return a;} LL r=exgcd(b,a%b,x,y),tmp; tmp=x;x=y;y=tmp-(a/b)*y; return r;}LL inv(LL a,LL b){ LL r=exgcd(a,b,x,y); while(x<0) x+=b; return x;}int main(){ #ifdef WIN32 freopen("a.in","r",stdin); #else #endif while(~scanf("%lld",&K)) { for(LL i=1;i<=K;i++) scanf("%lld%lld",&M[i],&C[i]); bool flag=1; for(LL i=2;i<=K;i++) { LL M1=M[i-1],M2=M[i],C2=C[i],C1=C[i-1],T=gcd(M1,M2); if((C2-C1)%T!=0) {flag=0;break;} M[i]=(M1*M2)/T; C[i]= ( inv( M1/T , M2/T ) * (C2-C1)/T ) % (M2/T) * M1 + C1; C[i]=(C[i]%M[i]+M[i])%M[i]; } printf("%lld\n",flag?C[K]:-1); } return 0;}

 

 
 
 

转载地址:http://urtnx.baihongyu.com/

你可能感兴趣的文章
乌克兰基辅一世遗修道院起火 现场火光照亮夜空
查看>>
[iOS 10 day by day] Day 2:线程竞态检测工具 Thread Sanitizer
查看>>
Centos/Ubuntu下安装nodejs
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
国内先进的智能移动广告聚合平台-KeyMob聚合
查看>>
我的友情链接
查看>>
ubuntu 镜像站部署
查看>>
Xshell 连接虚拟机慢 解决方案
查看>>
我的友情链接
查看>>
PHP - 如何打印函数调用树
查看>>
js闭包
查看>>
寒假。3.3.G - Common Child (最大公共子序)
查看>>
设计模式学习笔记--原型模式
查看>>
.Net 通过MySQLDriverCS操作MySQL
查看>>
JS Cookie
查看>>
ubuntu Unable to locate package sysv-rc-conf
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>