HDU 1573(X问题)

本文介绍了一种基于中国剩余定理的算法,用于解决一类特定的数学问题。该算法首先通过扩展欧几里得算法求解逆元,然后利用中国剩余定理求解线性同余方程组,最后计算满足条件的整数解的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;
const int MAXM = 15;

int A[MAXM], B[MAXM];

int gcd(int a, int b)
{
    if (!b) 
        return a;
    else 
        return gcd(b, a % b);
}

void exgcd(int a, int b, int& x, int& y)
{
    if (!b)
    {
        x = 1;
        y = 0;
    }
    else
    {
        exgcd(b, a % b, y, x);
        y -= a / b * x;
    }
}

int inv(int a, int b)
{
    int x = 0, y = 0;
    exgcd(a, b, x, y);
    x = (x % b + b) % b;
    if (!x)
        x += b;
    return x;
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int N, M;
        cin >> N >> M;
        bool flag = true;
        for (int i = 1; i <= M; i++)
            cin >> A[i];
        for (int i = 1; i <= M; i++)
        {
            cin >> B[i];
            B[i] %= A[i];
        }

        int m1, m2, c1, c2, t, ans;
        for (int i = 2; i <= M; i++)
        {
            m1 = A[i - 1]; m2 = A[i]; c1 = B[i - 1]; c2 = B[i];
            t = gcd(m1, m2);
            if ((c2 - c1) % t != 0)
            { 
                flag = false;
                break; 
            }
            A[i] = m1 * m2 / t;
            B[i] = ((inv(m1 / t, m2 / t) * ((c2 - c1) / t) % (m2 / t) * m1 + c1) % A[i] + A[i]) % A[i];
        }
        if (!flag)
            cout << 0 << endl;
        else
        {
            if (N < B[M])
            { 
                cout << 0 << endl;
                continue; 
            }
            ans = (N - B[M]) / A[M] + 1;
            if (!B[M])
                --ans;
            cout << ans << endl;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值