通过数据范围看,要是枚举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; }
原文:https://www.cnblogs.com/KGB1331/p/10999565.html