zoukankan      html  css  js  c++  java
  • HDU 3579 Hello Kiki 中国剩余定理(合并方程

    题意:

    给定方程

    res % 14 = 5

    res % 57 = 56

    求res

    中国剩余定理裸题

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<set>
    #include<queue>
    #include<vector>
    using namespace std;
    #define N 10005
    #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 inv(ll a, ll n) { //计算%n下 a的逆。假设不存在逆return -1;
    	ll d, x, y;
    	extend_gcd(a, n, d, x, y);
    	return d == 1 ? (x+n)%n : -1;
    }
    ll n[N],b[N],len,lcm;
    ll work(){
    	for(ll i = 2; i <= len; i++) {
    		ll A = n[1], B = n[i], d, k1, k2, c = b[i]-b[1];
    		extend_gcd(A,B,d,k1,k2);
    		if(c%d)return -1;
    		ll mod = n[i]/d;
    		ll K = ((k1*(b[i]-b[1])/d)%mod+mod)%mod;
    		b[1] = n[1]*K + b[1];
    		n[1] = n[1]*n[i]/d;
    	}
    	if(b[1]==0)return lcm;
    	return b[1];
    }
    int main(){
    	ll i,T,Cas=1;cin>>T;
    	while(T--){
    		cin>>len;
    		lcm = 1;
    		for(i=1;i<=len;i++) {
    			cin>>n[i];
    			lcm = lcm / gcd(lcm,n[i]) * n[i];
    		}
    		for(i=1;i<=len;i++)cin>>b[i];
    		cout<<"Case "<<Cas++<<": ";
    		cout<<work()<<endl;
    	}
    	return 0;
    }


  • 相关阅读:
    简单的验证码;在一个数组中随即打印出4个不重复的字母
    数据类型
    java语法基础
    mac 开机运行脚本
    【mac】 搭建java环境
    mac 复制文件到NTFS格式的移动硬盘
    JAVA学习日报 8.19
    JAVA学习日报 8.20
    (VI)事务:Spring 事务管理
    (VI)事务:Spring 事务细节
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7105797.html
Copyright © 2011-2022 走看看