您的位置:首页 > 其它

codevs1213(扩欧,求区间内解的数量)

2016-08-23 10:55 363 查看
求区间内解的数量这一类的题,总是感觉会有很多的细节考虑的不够全。然后就被各种数据搞。。。

虽然这题卡数据,需要吐槽,但是也学了一些方法

注释中~

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll n,x,y;
ll a,b,c,q,p,r,s;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if (b==0) {d=a;x=1;y=0;return;}
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
ll bdfc(ll a,ll b,ll c)
{
ll d;
exgcd(a,b,d,x,y);
if (c%d) return 0;
x=x*(c/d);
//y=y*(c/d);
int ka=a/d;
int kb=b/d;
if (x>p)
{
int t=(x-p)/kb;//如果要求一个区间的解的数量,首先想要到区间左端之前,但是直接while会被卡TLE,所以,既然只有减法,就可以改成除一下就好
x-=kb*t;//当然要判断一下,最后是否除到下面了,所以再减一下。。
if (x>p) x-=kb;
}
if (b) y=(c-a*x)/b;else y=0;
ll ans=0;
while (x<=q)
{
if (x>=p&&x<=q&&y>=r&&y<=s) ans++;
x+=kb;
y-=ka;
}
return ans;
}
int main()
{
scanf("%lld",&n);
while (n--)
{
scanf("%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&p,&q,&r,&s);
if(a==0&&b==0&&c==0)
{
if(q>=p&&s>=r)
cout<<(q-p+1)*(s-r+1)<<endl;
else cout<<"0"<<endl;
continue;
}
if(a==0&&b==0&c!=0)
{
cout<<"0"<<endl;
continue;
}
if (b==0)
{
ll ans=0;
cout<<"0"<<endl;
continue;
}
printf("%lld\n",bdfc(a,b,-c));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: