zoukankan      html  css  js  c++  java
  • 解的个数

    【题目描述】

    已知整数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;
    }
  • 相关阅读:
    hdu6314 容斥+数学
    后缀数组+指针
    F. Dominant Indices
    牛客网挑战赛19 B,C,F
    拓展欧几里得理论基础(含一定证明)
    数字
    vue的自定义树形列表组件(及数据格式转换)
    Activiti实现会签功能
    7种单例模式
    MySQL中数据类型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别)(转)
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5660177.html
Copyright © 2011-2022 走看看