Advertisement

HDU 1573X问题基于中国剩余定理

阅读量:

题目大意:统计所有不大于N的正整数中,满足X除以a[0]余b[0],X除以a[1]余b[1],X除以a[2]余b[2],……,X除以a[i]余b[i]等条件的数值个数(其中0 < a[i] <= 10)。

题目解析:根据题设条件,X mod a[0] = b[0]、X mod a[1] = b[1]、X mod a[2] = b[2]、……、X mod a[i] = b[i]。可以将其转化为数学表达式:(X - b[0]) / a[0]等于整数;(X - b[1]) / a[1]等于整数;(X - b[2]) / a[2]等于整数;……;(X - b[i]) / a[i]等于整数。由此可知,当且仅当(X - b[i])为a[i]的倍数时,该条件成立。因此,所有满足条件的X应当是各个a[i]对应的最小公倍数Lcm的倍数加上相应的偏移量。于是可将N划分为k个区间段,即N = k * Lcm + R,在每个长度为Lcm的区间内最多存在一个符合条件的数值。接下来只需检查从0到R这一范围内的数值中是否存在满足要求的解(最多仅有一个)。

复制代码
 #include<stdio.h>

    
 #include<stdlib.h>
    
 int Gcd( int a, int b )//求最大公约数
    
 {
    
     b==0?a:Gcd( b, a%b );

全部评论 (0)

还没有任何评论哟~