nyoj Biorhythms 用到剩余定理

三数为a b c余数分别为 m1 m2 m3,%为求余计算,&&意为“且”
  1、分别找出能被两个数整除,而满足被第三个整除余一的最小的数。
  k1%b==k1%c==0 && k1%a==1;
  k2%a==k2%c==0 && k2%b==1;
  k3%a==k3%b==0 && k3%c==1;
  2、将三个未知数乘对应数字的余数再加起来,减去这三个数的最小公倍数的整数倍即得结果。
  Answer = k1×m1 + k2×m2 + k3×m3 - P×(a×b×c);
  P为满足Answer > 0的最大整数;

  或者 Answer = (k1×m1 + k2×m2 + k3×m3)%(a×b×c) ;

 

poj上数据没有那么强大,暴力可以过,而nyoj上数据很多,暴力肯定过不了

 

具体代码如下:

#include <stdio.h>
int main()
{
 int a,b,c,d,n;
 while(1)
 {
  scanf("%d%d%d%d",&a,&b,&c,&d);
  if(a==-1&&b==-1&&c==-1&&d==-1) break;
  n=(5544*a+14421*b+1288*c)%21252-d;
  if(n<=0)n+=21252; //判断为负数则加上21252
  printf("%d\n",n);
 }
 return 0;
}

你可能感兴趣的:(nyoj Biorhythms 用到剩余定理)