1 条题解

  • 0
    @ 2025-8-24 22:12:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar VenusM1nT
    醉后不知天在水 满船清梦压星河 | 明日方舟群 348956527

    搬运于2025-08-24 22:12:21,当前版本为作者最后更新于2019-10-21 21:08:56,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

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

    k×(k+2x)=ax+bk\times (k+2x)=ax+b k2+2xk=ax+bk^2+2xk=ax+b 2xkax=bk22xk-ax=b-k^2 x(2ka)=bk2x(2k-a)=b-k^2 x=bk22kax=\frac{b-k^2}{2k-a}

    然后我们就可以枚举 kk 了。由于 bk2b-k^2 单调减,2ka2k-a 单调增,那么有一个时刻会是 2ka>02k-a>0bk2<0b-k^2<0,此时可以退出循环。答案合法的条件是 (2ka)(bk2)(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;
    }
    
    • 1

    信息

    ID
    4592
    时间
    1000ms
    内存
    500MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者