hdu1573X问题(不互素的中国剩余定理)

X问题

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3295    Accepted Submission(s): 1068

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

给出m组数,每一组代表x%ai = bi 。 求解x在n的范围内的数量。因为所有的ai不是互质的,所以不能直接用中国剩余定理,但是可以采用http://blog.csdn.net/winddreams/article/details/38425477

来处理,最后变成一个等式,求解出最小的正整数x(对于a*x + b*y = c 的等式,x的每次增长的是 b/gad(a,b) ),之后只要判断在n以内出现的次数就可以了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL __int64
LL t , n , m , d , x , y , i , bb , aa , flag ;
void gcd(LL a,LL b)
{
    if(b == 0)
    {
        d = a ; x = 1 ; y = 0 ;
    }
    else
    {
        gcd(b,a%b);
        swap(x,y);
        x = -x ; y = -y ;
        y += (a/b)*x ;
    }
    return ;
}
LL a[30] , b[30] ;

int main()
{
    scanf("%I64d", &t);
    while(t--)
    {
        scanf("%I64d %I64d", &n, &m);
        for(i = 0 ; i < m ; i++)
            scanf("%I64d", &a[i]);
       for(i = 0 ; i < m ; i++)
            scanf("%I64d", &b[i]);
        aa = a[0] ;
        bb = b[0] ;
        flag = 1 ;
        for(i = 1 ; i < m ; i++)
        {
            gcd(aa,a[i]);
            if( (b[i]-bb)%d != 0 )
                flag = 0 ;
            if( flag )
            {
                x = (b[i]-bb)/d*x ;
                y = a[i] / d ;
                x = ( x%y + y )%y ;
                bb = bb + x * aa ;
                aa = aa*a[i]/d ;
            }
        }
        gcd(1,aa);
        if( bb%d != 0 )
            flag = 0 ;
        if( flag )
        {
            x = ( bb/d )*x ;
            y = aa / d ;
            x = (x % y + y) % y ;
        }
        if( flag == 0 || x > n )
            printf("0\n");
        else
        {
            if( !x )
                printf("%I64d\n", (n-x)/y );
            else
            printf("%I64d\n", (n-x)/y+1 );
        }
    }
    return 0;
}

hdu1573X问题(不互素的中国剩余定理),布布扣,bubuko.com

时间: 2024-09-29 22:06:21

hdu1573X问题(不互素的中国剩余定理)的相关文章

poj2891--Strange Way to Express Integers(不互素的中国剩余定理)

题目链接:点击打开链接 题目大意:有一个数x,x%ai = ri ,给出n对ai和ri,问x的最小非负整数是什么,如果不存在输出-1 不互素的中国剩余定理: x%a1= r1 ; x%a2 = r2 ; 设k1,k2得到x = a1*k1 + r1 , x = a2*k2+r2 那么a1*k1+r1 = a2*k2+r2 --> a1*k1 = (r2-r1) + a2*k2---->对整个式子进行a2取余,得到(a1*k1)%a2 = (r2-r1)%a2,这里面只有一个未知量k1,用扩展g

数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers.

POJ 2891 中国剩余定理(不互素)

Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 17877   Accepted: 6021 Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is

hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)

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

lightoj 1319 - Monkey Tradition (中国剩余定理)

1319 - Monkey Tradition PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB In 'MonkeyLand', there is a traditional game called "Bamboo Climbing". The rules of the game are as follows: 1)       There are N monkeys who play

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k. 则同余方程组: x = a1 (mod n1) x = a2 (mod n2) ... x = ak (mod nk) 模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意义下,存在唯一的x,满足: x = ai mod [n1,n2,...,nk], i=1,2,3,...,k. 解可以写为这种形式: x = sigma(ai* 

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内有唯一解

中国剩余定理总结

当你遇到x == c (mod p) 要你求解x的时候,是不是很容易的想到了这样转换---> x - py = c运用extgcd得到答案.但是现在如果有很多个x呢?如: x == c1(mod p1) x == c2(mod p2) ............................... x == cn(mod pn) 这时候你要如何求解呢?肯定不能像上面一样吧! 其实这类问题有一个专门的算法成为孙子定理流行叫法是中国剩余定理(China Remainder Theorem). 一般一

中国剩余定理学习笔记

先看一道poj上的题目:[poj1006] Biorhythms 题意: 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期.然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现. 分析: 首先我们要知道,任意两个峰值之间一定相距整数倍的周期.假设一年的第N天达到峰值,则下次达到峰值