zoukankan      html  css  js  c++  java
  • 洛谷 P5596 【XR-4】题 题解

    原题链接

    本题只要 推式子 就可以了。

    [y^2-x^2=ax + b ]

    [a x + x^2 = y^2 - b ]

    [4 x^2 + 4 ax = 4 y^2 - 4b ]

    [(2x+a)^2-a^2=4y^2-4b ]

    [(2x+a)^2-4y^2=a^2-4b ]

    [(2x+a+2y)(2x+a-2y)=a^2-4b ]

    到这里,式子推完了。 用到了一些因式分解、配方、移项等的知识,应该不算难吧。

    而我们已知 (a)(b).

    此时只需要枚举 (a^2-4b) 的因子个数。但你会发现,不是所有的因子都可以满足 有正整数解的。

    比方说现在 (a^2-4b=u imes v(u leq sqrt{a^2-4b})),此时有:

    [2x+a-2y=u,2x+a+2y=v ]

    即:

    [2x+a=frac{u+v}{2},y=frac{v-u}{4} ]

    显然需要满足的是:

    [2|u+v , 4|v-u , u=a mod 2 , v=a mod 2 ]

    然后枚举即可。

    时间复杂度: (O(sqrt {a^2-4b}))

    但是,对于(a=10^8)(b=0),很有可能会超时。

    这时,观察两个性质:

    [u=a mod 2 , v=a mod 2 ]

    所以每次 (u)(v) 的枚举 (+2) 即可。 也就是它们的奇偶性和(a)一样。

    虽然常数上就是 (frac{1}{2}) ,但是事实说明在超时的边缘,这还是很重要的。

    #pragma GCC optimize(2)
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    
    inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
    	ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
    
    int main(){
    	ll a=read(),b=read();
    	ll x=a*a-4*b,ans=0;
    	if(!x) {printf("inf");return 0;}
    	for(ll i=(a+1)%2+1;i*i<=abs(x);i+=2){
    		if(x%i) continue;
    		ll u=i,v=abs(x/i);
    		if(x<0) u=-u;
    		if((v-u)%4) continue;
    		if(v-(v-u)/2<a) break;
    		ans++;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    
    简易的代码胜过复杂的说教。
  • 相关阅读:
    SVN客户端的安装和使用
    SVN服务器的安装和使用
    ssh port forwarding
    mysql 索引
    ssh forwarding 配置
    pymongo collection.save 问题
    linux 实现VLAN
    linux 硬件中断调节
    M2Crypto
    python 时间四舍五入
  • 原文地址:https://www.cnblogs.com/bifanwen/p/12498877.html
Copyright © 2011-2022 走看看