同余模方程--BIT 1053 Han Xin Count Soldiers
  VrZI4Uwu8BR1 2023年11月02日 64 0


用了2天多,尼玛的,幸好有ZY大神讲解及 对代码调试助攻。。自己程序太渣,还是上ZY代码吧。。

Han Xin Count Soldiers


时间限制: 1秒  内存限制: 64M


Description

In ancient China, there is a great general named Han Xin. One day he wanted to know how many soldiers he had. So he asked his soldiers to stand in one line for every 3 soldiers, and there are 2 left. Then he asked his soldiers to stand in one line for every 5 soldiers, and there are 3 left. At last he asked them to stand in one line for every 7 soldiers, then there are 2 left. After that he knew he had 1073 soldiers! But now there are a lot of soldiers in front of Han Xin, and he wants to know the number again. He has asked his soldiers stand in lines for n (1 <= n <= 100) rounds. And in the ith round, he asked his soldiers stand in one line for every pi (2 <= pi <= 1000) soldiers, and there is ri (0 <= ri < pi) left. Now can you told Han Xin how many soldiers he have ?

Input

The input has several test cases. For each test case, there is one integer n (1 <= n <= 1000) in the first line. And then there n lines, each line has two integers pi (2 <= pi <= 1000) and ri (0 <= ri < pi). The input is ended by EOF.

Output

For each test case, please output the number of soldiers Han Xin had. If there are more than one solution, please output the smallest positive one. And if there is no solution, please output -1 instead.

Sample Input

3

3 2

5 3

7 2

2

4 1

6 3

Sample Output

23

9



有两组的话,设为a1,b1,a2,b2.

可得:x≡b1(mod a1);    ---   x=b1+a1*y1;

x≡b2(mod a2);    ---   x=b2+a2*y2;

得:b1+a1*y1 = b2 (mod a2);

      a1*y1 = (b2-b1) (mod a2);

      y1 = (b2-b1)*(a1对a2 的逆元)  (mod a2);   //求a1逆元时,a1和a2可以约分,整个方程需要约分。

y1求出后,即可得出一个针对  前两个方程的解,x0;

然后的 x≡x0 (mod lcm(a1,a2));

这样 ,两个方程可以变为一个方程了。。

然后 n 个方程就能变为一个方程了。。


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define ll long long
ll a1,b1,a2,b2;
ll x,y,flag;
ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
ll exgcd(ll a,ll b)
{
	ll t,gcd;
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	gcd=exgcd(b,a%b);
	t=x,x=y,y=t-a/b*y;
	return gcd;
}
int main()
{
	int i,j,k,n;
	ll d,t,tem,bb;
	while(~scanf("%d",&n)){
		flag=0;
		scanf("%lld%lld",&a1,&b1);
		for(i=1;i<n;i++){
			scanf("%lld%lld",&a2,&b2);
			d=gcd(a1,a2);
			if((b2-b1)%d==0){
				exgcd(a1/d,a2/d);//先约分,再求逆元
				tem=x;//求出的逆元
				k=(tem*(b2-b1)/d)%(a2/d);
				b1=(k*a1+b1)%(a1/d*a2);
				a1=(a1/d*a2);
			}else
				flag=1;
		}
		if(flag==1) printf("-1\n");
		else{
			b1=(b1+a1)%a1;
			if(b1==0) b1=a1;
			printf("%lld\n",b1);
		}
	}
}




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  0m5NSAqMb1kD   2023年12月08日   31   0   0 MySQLMySQLcici
  5a6ysVJd64PV   2023年12月12日   31   0   0 ciredisciredis
VrZI4Uwu8BR1