解的个数

【题目描述】

已知整数X、Y满足如下列条件:

①Ax+By+C = 0;

②P <= X <= Q;

③R <= Y <= S;

求满足条件的X、Y个数。

【输入描述】

第一行输入一个整数n(n <= 10),表示有n个任务;

接下来n行,每行输入七个整数A、B、C、P、Q、R、S,均不超过108

【输出描述】

输出n行,每行包含一个数,表示答案。

【样例输入】

2

2 3 -7 0 10 0 10

1 1 1 -10 10 -9 9

【样例输出】

1

19

 

枚举:

源代码:

#include<iostream>
using namespace std;
long long n; //注意Long Long。
int main()
{
    cin>>n;
    for (int a=1;a<=n;a++)
    {
        long long t1,t2,t3,left1,right1,left2,right2,ans(0);
        cin>>t1>>t2>>t3>>left1>>right1>>left2>>right2;
        if (t2==0) //特判0。
        {
            for (int b=left1;b<=right1;b++) //就是枚举,任性。
              if (b*t1==-t3)
                ans++;
            cout<<ans*(right2-left2+1)<<endl;
        }
        else
        {
            for (int b=left1;b<=right1;b++)
              if ((-t3-t1*b)%t2==0&&(-t3-t1*b)*1.0/t2>=left2&&(-t3-t1*b)*1.0/t2<=right2) //就是枚举!
                ans++;
            cout<<ans<<endl;
        }
    }
    return 0;
}

 

拓展欧几里得:

源代码:

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
double z[4];
void exgcd(long long t1,long long t2,long long &d,long long &x,long long &y)
{
    if (!t2)
    {
        d=t1;
        x=1;
        y=0;
        return;
    }
    exgcd(t2,t1%t2,d,y,x);
    y-=x*(t1/t2);
    return;
}
int main()
{
    long long t1,t2,t3,left1,right1,left2,right2,x,y,d,k; //d为最大公约数,
    int n;
    cin>>n;
    while (n--)
    {
        cin>>t1>>t2>>t3>>left1>>right1>>left2>>right2;
        t3=-t3;
        if (left1>right1||left2>right2||(!t1&&!t2&&t3)) //特判。
        {
            cout<<0<<endl;
            continue;
        }
        if (!t1||!t2) //特判。
        {
            if (!t1) //还他娘的是特判。
              t1=right1-left1+1;
            else
              if (t3%t1==0&&(t3/t1)<=right1&&(t3/t1)>=left1)
                t1=1;
              else
                t1=0;
            if (!t2)
              t2=right2-left2+1;
            else
              if (t3%t2==0&&(t3/t2)<=right2&&(t3/t2)>=left2)
                t2=1;
              else
                t2=0;
            cout<<t1*t2<<endl;
            continue;
        }
        exgcd(t1,t2,d,x,y);
        if (t3%d!=0)
        {
            cout<<0<<endl;
            continue;
        }
        k=t3/d;
        x*=k;
        y*=k;
        t1=t1/d;
        t2=t2/d;
        z[0]=(right1-x)*1.0/t2;
        z[1]=(left1-x)*1.0/t2;
        z[2]=(y-right2)*1.0/t1;
        z[3]=(y-left2)*1.0/t1;
        sort(z,z+4);
        t1=floor(z[2]);
        t2=ceil(z[1]);
        cout<<t1-t2+1<<endl;
    }
    return 0;
}
posted @ 2016-07-11 14:37  前前前世。  阅读(206)  评论(0编辑  收藏  举报