a,b公差的最小公倍数就是c的公差
判断0的情况比较多,但是都比较trival
1. 区间c未完全属于区间a
2.公差不能除尽
3.首项之差不能除尽a的公差,简而言之就是对不上
判断-1的情况我考场的想法是枚举之后再判断,但是这样比较复杂,考虑一个最长的枚举的长度,也就是a的公差,直接判断即可
剩下的考场上大概我有思路,但实在不太想打,答案就是枚举b这个公差是多少,因为枚举了b的公差之后可以保证以下性质,b的公差在sqrt的数量级,接下来只会有两边拓展开的那些部分,可以相乘再加上
贴个官方代码
cin >> b >> q >> y;
cin >> c >> r >> z;
long long e = b+q*(y-1);
long long f = c+r*(z-1);
if(c<b || c>e || f<b || f>e || r%q!=0 || (c-b)%q!=0)
cout << 0 << '\n';
else if(c-r<b || f+r>e)
cout << -1 << '\n';
else
{
long long ans = 0;
for(long long p=1;p*p<=r;p++)
{
if(r%p==0)
{
if(lcm(p,q)==r)
{
long long a = ((r/p)*(r/p))%MOD;
ans = (ans+a)%MOD;
}
if(p*p!=r && lcm(r/p,q)==r)
{
long long a = (p*p)%MOD;
ans = (ans+a)%MOD;
}
}
}