HDU 1788 Chinese remainder theorem again 中国剩余定理

题意:

给定n,AA

下面n个数m1,m2···mn

则有n条方程

res % m1 = m1-AA

res % m2 = m2-AA

问res的最小值

直接上剩余定理,嘿嘿

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<queue>
#include<vector>
using namespace std;
#define ll __int64
ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
//求一组解(x,y)使得 ax+by = gcd(a,b), 且|x|+|y|最小(注意求出的 x,y 可能为0或负数)。
//下面代码中d = gcd(a,b)
//可以扩展成求等式 ax+by = c,但c必须是d的倍数才有解,即 (c%gcd(a,b))==0
void extend_gcd (ll a , ll b , ll& d, ll &x , ll &y) {
	if(!b){d = a; x = 1; y = 0;}
	else {extend_gcd(b, a%b, d, y, x); y-=x*(a/b);}
}
ll work(ll l, ll r, ll *m, ll *a){
	ll lcm = 1;
	for(ll i = l; i <= r; i++)lcm = lcm/gcd(lcm,m[i])*m[i];
	for(ll i = l+1; i <= r; i++) {
		ll A = m[l], B = m[i], d, k1, k2, c = a[i]-a[l];
		extend_gcd(A,B,d,k1,k2);
		if(c%d)return -1;
		ll mod = m[i]/d;
		ll K = ((k1*c/d)%mod+mod)%mod;
		a[l] = m[l]*K + a[l];
		m[l] = m[l]*m[i]/d;
	}
	if(a[l]==0)return lcm;
	return a[l];
}
#define N 100
ll a[N], m[N], n, AA;;
int main(){
	ll i;
	while(cin>>n>>AA,n){
		for(i=1;i<=n;i++)cin>>m[i];
		for(i=1;i<=n;i++)a[i] = m[i]-AA;
		cout<<work(1,n,m,a)<<endl;
	}
	return 0;
}

HDU 1788 Chinese remainder theorem again 中国剩余定理

时间: 2024-10-07 06:00:25

HDU 1788 Chinese remainder theorem again 中国剩余定理的相关文章

HDU 1788 Chinese remainder theorem again

题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. 1 //1788 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <iostream> 6 #define LL long long 7 8 using namespace std ; 9 10 LL gcd(LL x,LL y)

hdu 1788 Chinese remainder theorem again 最小公倍数

Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2014    Accepted Submission(s): 777 Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余

HDU——1788 Chinese remainder theorem again

Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3174    Accepted Submission(s): 1371 Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的:假设m1,m2,…,mk两两互素,则下面同余

Chinese remainder theorem 中国剩余定理

中国剩余定理: x ≡ a1 (% m1) x ≡ a2 (% m2) . . . x ≡ an (% mn) m1,m2...mn 互质.我们求里面的x,就会用到中国剩余定理.首先将 x 看成 s ,则 s ≡ a1 (% m1) 1式 s + m1 * y = a1 另 M = m1 * m2 * m3 * m4 * ... * mn Mi = M / mi 因为 m1,m2...mn 互质所以 (Mi, mi) = 1 所以 可以表示成 Mi * x + mi * y = 1 2式 所以

初识中国余数定理 (Chinese Remainder Theorem)

初识中国余数定理 (Chinese Remainder Theorem) 中国余数定理介绍 起源: 在<孙子算经>中有这样一个问题: "今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?" 这个问题称为"孙子问题",该问题的一般解法国际上称为"中国剩余定理". 解法: 设未知数为X 1. 找到三个数: 1). 从3和5的公倍数中找到被7除余1的数,15: 2). 从5和7的公

Chinese remainder theorem again(中国剩余定理+不互质版+hud1788)

Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1788 Appoint description:  System Crawler  (2015-04-27) Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,m

Chinese remainder theorem again(中国剩余定理)

C - Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,…,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2(mod m2) … x≡ak(mod mk) 在0<=<m1m2…mk内有唯一解

HDU 1573 X问题 中国剩余定理

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路:中国剩余定理的模板题,如果找不到这样的数或者最小的X大于N,输出零. 代码: #include <iostream> #include

hdu 3579 Hello Kiki 不互质的中国剩余定理

Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description One day I was shopping in the supermarket. There was a cashier counting coins seriously when a little kid running and singing "门前大桥下游过一