HDU 1573 X问题

http://acm.hdu.edu.cn/showproblem.php?pid=1573

解出最小解rr后,特判下其是否为0,为0的话,就直接n / lcm

否则 + 1

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>

const int maxn = 500 + 20;
LL mod[maxn];
LL r[maxn];
LL gcd(LL n, LL m) {
    if (n % m == 0) return m;
    else return gcd(m, n % m);
}
LL lcm(LL n, LL m) {
    return n / gcd(n, m) * m;
}
LL exgcd (LL a,LL mod,LL &x,LL &y) {
    //求解a关于mod的逆元     ★:当且仅当a和mod互质才有用
    if (mod==0) {
        x=1;
        y=0;
        return a;//保留基本功能,返回最大公约数
    }
    LL g=exgcd(mod,a%mod,x,y);
    LL t=x;    //这里根据mod==0  return回来后,
    x=y;    //x,y是最新的值x2,y2,改变一下,这样赋值就是为了x1=y2
    y=t-(a/mod)*y;    // y1=x2(变成了t)-[a/mod]y2;
    return g;            //保留基本功能,返回最大公约数
}
bool get_min_number (LL a,LL b,LL c,LL &x,LL &y) {  //得到a*x+b*y=c的最小整数解
    LL abGCD = gcd(a,b);
    if (c % abGCD != 0) return false;//不能整除GCD的话,此方程无解
    a /= abGCD;
    b /= abGCD;
    c /= abGCD;
    LL tx,ty;
    exgcd(a,b,tx,ty); //先得到a*x+b*y=1的解,注意这个时候gcd(a,b)=1
    x = tx * c;
    y = ty * c; //同时乘上c,c是约简了的。得到了一组a*x + b*y = c的解。
    LL haveSignB = b;
    if (b < 0) b = -b;   //避免mod负数啊,模负数没问题,模了负数后+负数就GG
    x = (x % b + b) % b; //最小解
//    if (x == 0) x = b; //避免x = 0不是"正"整数  不要用这个,溢出
    y = (c - a * x) / haveSignB;
    return true;//true代表可以
}

void work () {
    LL n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        cin >> mod[i];
    }
    for (int i = 1; i <= m; ++i) {
        cin >> r[i];
    }
    LL mm = mod[1];
    LL ansx = 0;
    LL rr = r[1];
    for (int i = 2; i <= m; ++i) {
        LL x, y;
        bool ret = get_min_number(mm, -mod[i], r[i] - rr, x, y);
        if (ret == false) {
            printf("0\n");
            return;
        }
        ansx = mm * x + rr;
        mm = lcm(mm, mod[i]);
        rr = ansx % mm;
    }
    int add = rr != 0;
    if (rr > n) {
        printf("0\n");
        return ;
    }
    cout << (n - rr) / mm + add << endl;
    return ;
}

int main() {
#ifdef local
    freopen("data.txt","r",stdin);
#endif
    int t;
    cin >> t;
    while (t--) work();
    return 0;
}

时间: 2024-10-20 17:02:09

HDU 1573 X问题的相关文章

HDU 1573 CRT

CRT模板题 /** @Date : 2017-09-15 13:52:21 * @FileName: HDU 1573 CRT EXGCD.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair

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 1573 X问题

HDU 1573 X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4857    Accepted Submission(s): 1611 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2],

hdu 1573 X问题 (非互质的中国剩余定理)

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2980    Accepted Submission(s): 942 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod

HDU——1573 X问题

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6716    Accepted Submission(s): 2340 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mo

HDU 1573 X问题 (中国剩余定理)

题目链接 题意 : 中文题不详述. 思路 : 中国剩余定理.求中国剩余定理中解的个数.看这里看这里 1 //1573 2 #include <stdio.h> 3 #include <iostream> 4 #include <math.h> 5 6 using namespace std ; 7 8 long long x,y ; 9 long long N,M ; 10 11 long long ext_gcd(long long a,long long b) 12

X问题 HDU - 1573(excrt入门题)

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8365    Accepted Submission(s): 3037 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod

HDU 1573 模线性方程

给定模线性方程组,求最终的值的通解.点击 两个模方程可以化解成一个模方程 x mod a1 = b1 x mod a2 = b2 a1*k1 + a2*k2 = b2 – b1 // 其中k1k2是自由元 用扩展欧几里得算出k1的解,当然它是一个解系,找出最小k1作为特解,带入x = a1 * k1 + b1得到x 然后把这个x当作特解,记作x1. 之前k1本来是一个解系,他的模是a2/gcd(a1,a2),[简单将gcd(a1,a2)记作t], 也就是说k1如果作为一个解系的话,k1 = a2

HDU 1573

特判r1=0时的情况,因为0是不能模的. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MaxM=11; int a[MaxM],b[MaxM]; void exgcd(int a,int b,int &d,int &x,int &y){ if(b==0){ x=1