题解 P5596 【【XR-4】题】

· · 题解

数学题。
好题啊(
首先判断无限解情况,将 x 移到右边,显然当 x^2+ax+b 为完全平方,即 (\frac a2)^2=b 时有无数解。当然,为了避免精度误差,可以将它写成 a^2=4\times b
然后来考虑怎么解此题,我们将左式因式分解,得:

(y-x)(y+x)=ax+b

k=y-x,原式可以化为:

k\times (k+2x)=ax+b k^2+2xk=ax+b 2xk-ax=b-k^2 x(2k-a)=b-k^2 x=\frac{b-k^2}{2k-a}

然后我们就可以枚举 k 了。由于 b-k^2 单调减,2k-a 单调增,那么有一个时刻会是 2k-a>0b-k^2<0,此时可以退出循环。答案合法的条件是 (2k-a)|(b-k^2)

#include<bits/stdc++.h>
#define MAXN 
#define reg register
#define inl inline
#define int long long
using namespace std;
int a,b,ans;
signed main()
{
    scanf("%lld %lld",&a,&b);
    if(a*a==4*b) return puts("inf"),0;
    reg int x=1,t=sqrt(b);
    if(t*t==b) ans++;
    while(1)
    {
        reg int A=x*2-a,B=b-x*x;
        if(((A>0 && B>0) || (A<0 && B<0)) && !(B%A)) ans++;
        if(A>0 && B<0) break;
        x++;
    }
    printf("%lld\n",ans);
    return 0;
}