zoukankan      html  css  js  c++  java
  • 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 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
     
    Author
    lwg
     
    Source
     
    Recommend
    linle   |   We have carefully selected several similar problems for you:  1788 1452 1299 1370 3826 
     

    基本是模板题:

    当命题正确是在每个最小公倍数内有唯一解。

    注意一下符合条件的个数= 上限数/最小公倍数 ,注意0的处理。

     1 //0MS    244K    1687 B    C++    
     2 #include<stdio.h>
     3 __int64 gcd(__int64 a,__int64 b)
     4 {
     5     return b?gcd(b,a%b):a;
     6 }
     7 __int64 extend_euclid(__int64 a,__int64 b,__int64 &x,__int64 &y)
     8 {
     9     if(b==0){
    10         x=1;y=0;
    11         return a;
    12     }
    13     __int64 d=extend_euclid(b,a%b,x,y);
    14     __int64 t=x;
    15     x=y;
    16     y=t-a/b*y;
    17     return d;
    18 }
    19 __int64 inv(__int64 a,__int64 n)
    20 {
    21     __int64 x,y;
    22     __int64 t=extend_euclid(a,n,x,y);
    23     if(t!=1) return -1;
    24     return (x%n+n)%n;
    25 }
    26 bool merge(__int64 a1,__int64 n1,__int64 a2,__int64 n2,__int64 &a3,__int64 &n3)
    27 {
    28     __int64 d=gcd(n1,n2);
    29     __int64 c=a2-a1;
    30     if(c%d) return false;
    31     c=(c%n2+n2)%n2;
    32     c/=d;
    33     n1/=d;
    34     n2/=d;
    35     c*=inv(n1,n2);
    36     c%=n2;
    37     c*=n1*d;
    38     c+=a1;
    39     n3=n1*n2*d;
    40     a3=(c%n3+n3)%n3;
    41     return true;
    42 }
    43 __int64 china_reminder2(int len,__int64 *a,__int64 *n,__int64 &lcm)
    44 {
    45     __int64 a1=a[0],n1=n[0];
    46     __int64 a2,n2;
    47     for(int i=1;i<len;i++){
    48          __int64 aa,nn;
    49          a2=a[i],n2=n[i];
    50          if(!merge(a1,n1,a2,n2,aa,nn)) return -1;
    51          a1=aa;
    52          n1=nn;
    53     }
    54     lcm=n1;
    55     return (a1%n1+n1)%n1;
    56 }
    57 int main(void)
    58 {
    59     int t,n,m;
    60     __int64 a[15],b[15],lcm;
    61     scanf("%d",&t);
    62     while(t--)
    63     {
    64         scanf("%d%d",&n,&m);
    65         for(int i=0;i<m;i++) scanf("%I64d",&a[i]);
    66         for(int i=0;i<m;i++) scanf("%I64d",&b[i]);
    67         __int64 ans=china_reminder2(m,b,a,lcm);
    68         //printf("%I64d %I64d
    ",ans,lcm);
    69         int result;
    70         if(ans==-1 || n<ans) result=0;
    71         else{
    72              result=(n-ans)/lcm+1;
    73              if(ans==0) result--;
    74         } 
    75         printf("%d
    ",result);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    LeetCode 27. Remove Element(C++)
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 21. Merge Two Sorted Lists(c++)
    LeetCode 20. Valid Parentheses(c++)
    LeetCode 14.Longest Common Prefix(C++)
    poj1847 Tram(最短路dijkstra)
    poj 3268 Silver Cow Party(最短路dijkstra)
    LeetCode 13. Roman to Integer(c语言版)
    hdu2181 简单搜索
    python 算法 day1
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3785652.html
Copyright © 2011-2022 走看看