zoukankan      html  css  js  c++  java
  • 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
    ");
            else
            {
                if( !x )
                    printf("%I64d
    ", (n-x)/y );
                else
                printf("%I64d
    ", (n-x)/y+1 );
            }
        }
        return 0;
    }
    

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5305826.html
Copyright © 2011-2022 走看看