题解 洛谷P2833 【等式】

运用暴力解方程吸氧过了这道题

通过数据范围看,要是枚举x和y只能炸掉三成的数据。

所以考虑枚举从x1到x2枚举x,通过方程移项可知y=-(ax+c)/b,再判断y是否在y1和y2之间即可。

本题本做法主要坑点:

1、a=b=0时要特判(分为c=0和c!=0两种情况)

2、y1和y2是cmath库关键字

3、注意精度问题

#pragma GCC optimize(1)    
#include<bits/stdc++.h>
#define ll long long
using namespace std;

signed main(void)
{
    ll a,b,c,ans=0;
    ll x1,x2,y_1,y_2;   //y1和y2是cmath关键字,定义这两个家伙会CE
    scanf("%lld%lld%lld",&a,&b,&c);
    scanf("%lld%lld%lld%lld",&x1,&x2,&y_1,&y_2);

    if(a==0&&b==0)  //当a=b=0
    {   
        if(c!=0)    //如果c不为0,等式根本不成立
        {  
            puts("0");
            return 0;
        }

        else if(c==0)   //如果c=0,任何一个x与y的配对都成立
        {
            ll x_1=abs(x2-x1)+1,
            x_2=abs(y_2-y_1)+1,
            xx=x_1*x_2;
            printf("%lld\n",xx);
            return 0;
        }
    }

    for(ll x=x1;x<=x2;x++)  //常规情况:ax+by+c=0=>-(ax+c)/b=y
    {
        ll axc=(a*x+c)*-1; 
        double _ax_c=axc,
        y=_ax_c/b;  //计算y值
        if(y>=y_1&&y<=y_2&&(a*x+b*(ll)y+c)==0) ans++;   //判断y是否在范围内
        //此处存在精度问题,要用y的整数范围验算判断
    } 

    printf("%lld\n",ans);
    return 0; 
}

 

posted @ 2019-06-10 18:51  KGB1331  阅读(125)  评论(0编辑  收藏  举报