Hdu 1573 X问题 中国剩余定理模板

Problem Description

求在小于等于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)。

Input

输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为两个正整数N,M (0 < N <= 1000,000,000 , 0 < M <= 10),表示X小于等于N,数组a和b中各有M个元素。接下来两行,每行各有M个正整数,分别为a和b中的元素。

Output

对应每一组输入,在独立一行中输出一个正整数,表示满足条件的X的个数。

Sample Input

 

3

10 3

1 2 3

0 1 2

100 7

3 4 5 6 7 8 9

1 2 3 4 5 6 7

10000 10

1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9

Sample Output

 

1

0

3

中国剩余定理的模板题目...

求出最小数之后再累加上他们的最小公倍数求个数....

要注意求的是正整数,如果求出为最小数为0的话,需要减一....

代码入下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=15;
typedef __int64 ll;
int t;
ll a[maxn],b[maxn];
ll n,m;
ll Extend (ll A,ll B,ll& X,ll& Y)
{
    if(B==0)
    {
        X=1; Y=0;
        return A;
    }
    else
    {
        ll temp,ans;
        ans=Extend (B,A%B,X,Y);
        temp=X;
        X=Y;
        Y=temp-A/B*Y;
        return ans;
    }
}
void solve ()
{
    int sum=0;
    ll x,y,d,t,c;
    for (int i=1;i<m;i++)
    {
        c=b[i]-b[i-1];
        d=Extend(a[i-1],a[i],x,y);
        if(c%d)
        {
            printf("0\n");
            return;
        }
        x=c/d*x;
        t=a[i]/d;
        x=(x%t+t)%t;
        b[i]=a[i-1]*x+b[i-1];
        a[i]=a[i]/d*a[i-1];
    }
    if(b[m-1]==0)
        b[m-1]=a[m-1];
    for (ll i=b[m-1];i<=n;i+=a[m-1])
          sum++;
    printf("%d\n",sum);
}
int main()
{
    scanf("%d",&t);
    while (t--)
    {
       scanf("%I64d%I64d",&n,&m);
       for (ll i=0;i<m;i++)
            scanf("%I64d",&a[i]);
       for (ll i=0;i<m;i++)
            scanf("%I64d",&b[i]);
       solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/83116673