Chinese remainder theorem again
题目链接
题目大意
就是说现在有
n mod m1=m1−an mod m2=m2−a...n mod mi=mi−a
求一个最小的n~~
题解
可以化简:
n=kmi+mi−an=(k+1)mi−an+a=(k+1)mi
明显可以看出等式右边是 mi 的整数倍,所以我们求出 mi 的最小公倍数再减a就好。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
using namespace std;
LL n,a,m[15];
LL lcm;
LL gcd(LL a,LL b)
{
if (b==0) return a;
else return gcd(b,a%b);
}
int main()
{
while(scanf("%I64d%I64d",&n,&a),n!=0 || a!=0)
{
for (int i=0;i<n;i++) scanf("%I64d",&m[i]);
lcm=m[0];
for (int i=0;i<n;i++)
lcm=lcm/gcd(lcm,m[i])*m[i];
lcm-=a;
printf("%I64d\n",lcm);
}
return 0;
}