1213 解的个数

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
 
 
题目描述 Description

已知整数x,y满足如下面的条件:

ax+by+c = 0

p<=x<=q

r<=y<=s

求满足这些条件的x,y的个数。

输入描述 Input Description

第一行有一个整数nn<=10),表示有n个任务。n<=10

以下有n行,每行有7个整数,分别为:a,b,c,p,q,r,s。均不超过108

输出描述 Output Description

n行,第i行是第i个任务的解的个数。

样例输入 Sample Input

2

2 3 -7 0 10 0 10

1 1 1 -10 10 -9 9

样例输出 Sample Output

1

19

数据范围及提示 Data Size & Hint
 

分类标签 Tags 点此展开

神坑啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

以下内容摘自某大神的题解

1.首先我们可以很直观地看出来这是用扩展欧几里得算法解二元一次方程,但问题是我们所熟悉的扩欧能解的方程都是ax+by=gcd(a,b)形式的,而题目给出的是ax+by=-c形式。举个例子:

2x+4y=18,首先我们可以换成x+2y=9形式。9不是2和4的最大公约数1,但9是1的倍数,所以如果我们解出一组x,y满足x+2y=1,那么x和y都乘上9/1就是原方程的一组解了。如果c/gcd(a,b)==0,那么就没有整数解。

2.如今我们得到了一组x,y,根据扩欧定理的后续内容,适合的解系一定是(x+bk,y-ak),注意现在的a,b是简化后的方程的系数(拿上面提到的例子讲,现在a=1,b=2),枚举找在区间内的解的个数(组数)就好。

3.现在解决各种WA/TLE/RE问题:

(1)方程无解:c/gcd(a,b)==0,直接输出0;

(2)区间不合法:题目中没有保证区间左端点小于右端点,所以如果读入的区间不合法,直接输出0;

(3)a=0或b=0:

if((a==0)&&(y<r||y>s)) {printf("0\n");continue;}

     if((b==0)&&(x<p||x>q)) {printf("0\n");continue;}

因为不管加多少,x/y还是原来的味道……但是如果不加特判可能会导致TLE(这个跟代码具体的写法有关,我后面有用while循环,直接卡T了)

(4)a==0&&b==0:

RE的关键所在,因为gcd求出来是0……这个需要认真思考一下,如果c!=0,显然方程不成立,无解;如果c==0,x和y就可以任意取了,由乘法原理可得解的个数就是两个区间内部整数点的个数的乘积

if (c!=0)printf("0\n");

else

{

    ll cnt=(q-p+1)*(s-r+1);

    printf("%lld\n",cnt);

}         

continue;

(5)记得要开long long

两个神坑的数据点:

4

0 1 2 0 0 0 2

1 0 2 0 0 0 0

1 0 2 0 2 0 20

2 0 3 -10 10 -10 10

ans:0   0   0   0

4

0 0 0 -1 1 -1 1

0 0 0 1 -1 1 2

0 0 1 1 1 1 1

0 0 0 -3406792423987599 -23487749 23947250

ans:9   0   0   2753863780940000

 #include<iostream>
#include<cstdio>
using namespace std;
long long int x,y;
long long int tot=;
long long int a,b,c,p,q,r,s;
long long int gcd(long long int a,long long int b)
{
if(b==)
return a;
else
return gcd(b,a%b);
}
long long int exgcd(long long int a,long long int b,long long int & x,long long int & y)
{
if(b==)
{
x=;
y=;
return a;
}
long long int r=exgcd(b,a%b,x,y);
long long int tmp;
tmp=x;
x=y;
y=tmp-a/b*y;
return r;
}
int main()
{ int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
tot=;
//scanf("%lld %lld %lld %lld %lld %lld %lld",&a,&b,&c,&p,&q,&r,&s);
cin>>a>>b>>c>>p>>q>>r>>s;
c=-c;
if((a==)&&(y<r||y>s))
{
printf("0\n");
continue;
}
if((b==)&&(x<p||x>q))
{
printf("0\n");
continue;
} if(p>q||r>s)
{
cout<<<<endl;
continue;
} int gys=gcd(a,b);
if(gys==)
{
if (c!=)
{
printf("0\n");
continue;
}
else
{
tot=(q-p+)*(s-r+);
printf("%lld\n",tot);
continue;
}
}
if(c%gys!=)
{
cout<<<<endl;
continue;
}
exgcd(a,b,x,y);
x=x*(c/gys);
y=y*(c/gys);
a=a/gys;
b=b/gys;
while(x>=p)
{
x=x-b;
y=y+a;
}
while(x<p&&b!=)
{
x=x+b;
y=y-a;
}
while(x>=p&&x<=q&&y>=r&&y<=s)
{
tot++;
x=x+b;
y=y-a;
if(x<p||x>q||y<r||y>s)
break;
}
printf("%lld\n",tot);
} return ;
}

codevs 1213 解的个数的更多相关文章

  1. 扩展gcd codevs 1213 解的个数

    codevs 1213 解的个数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 已知整数x,y满足如下面的条件: ax+by ...

  2. Codevs 1213 解的个数(exgcd)

    1213 解的个数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c=0 p< ...

  3. codevs 1213 解的个数(我去年打了个表 - -)

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int T,x ...

  4. 解的个数(codevs 1213)

    题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input ...

  5. n元线性方程非负整数解的个数问题

    设方程x1+x2+x3+...+xn = m(m是常数) 这个方程的非负整数解的个数有(m+n-1)!/((n-1)!m!),也就是C(n+m-1,m). 具体解释就是m个1和n-1个0做重集的全排列 ...

  6. codevs1213 解的个数

    题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input ...

  7. P1098 方程解的个数

    题目描述 给出一个正整数N,请你求出x+y+z=N这个方程的正整数解的组数(1<=x<=y<=z<1000).其中,1<=x<=y<=z<=N . 输入 ...

  8. HDU1573 线性同余方程(解的个数)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. CODEVS——T1979 第K个数

    http://codevs.cn/problem/1979/ 时间限制: 1 s  空间限制: 1000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descript ...

随机推荐

  1. 最优的cuda线程配置

    1 每个SM上面失少要有192个激活线程,寄存器写后读的数据依赖才能被掩盖   2 将 寄存器 的bank冲突降到最低,应尽量使每个block含有的线程数是64的倍数   3 block的数量应设置得 ...

  2. centOS系统将php升级到5.6 安装扩展

    在文章中,我们将展示在centOS系统下如果将php升级到5.6,之前通过yum来安装lamp环境,直接升级的话,提示没有更新包,也就是说默认情况下php5.3.3是最新 1.查看已经安装的php版本 ...

  3. CI框架源码学习笔记2——Common.php

    上一节我们最后说到了CodeIgniter.php,可是这一节的标题是Common.php,有的朋友可能会觉得很奇怪.事实上,CodeIgniter.php其实包含了ci框架启动的整个流程. 里面引入 ...

  4. U19464 山村游历(Wander) LCT维护子树大小

    \(\color{#0066ff}{ 题目描述 }\) 在一个偏远的小镇上,有一些落后的山村.山村之间通过一些道路来连接.当然有的山村可能不连通. 一年当中会发生很多大事,比如说有人提议要在山村\(i ...

  5. USACO 1.3.6 Ski Course Design[滑雪课程设计]

    先说说思路: 这题比上一道坑人的wormholes简单多了!我一看到这题,“XXX设计”,还以为要用到什么dp呢,没想到是水题 用两层循环,第一层循环相差17中的上界,第二层遍历所有的山峰计算答案.并 ...

  6. 设置label的文字,一行多种颜色

    调用 [self fuwenbenLabel:contentLabel FontNumber:[UIFont systemFontOfSize:] AndRange:NSMakeRange(, ) A ...

  7. java 的开发工具IDEA使用 中Debug 调试工具使用

    IDEA JetBrains(这个公司的名称翻译过来就是“大脑喷射?”) 公司的宣传语是这么说的:Develop with pleasure!(带着快乐开发!)   话不多说 开始debug   1, ...

  8. [Maven]How do I tell Maven to use the latest version of a dependency?

    Link: http://stackoverflow.com/questions/30571/how-do-i-tell-maven-to-use-the-latest-version-of-a-de ...

  9. sharepoint_study_9

    描述:sharepoint2013 网站修改导航条标题 SuiteBartext 图示: 解决: 管理员身份进sharepoint powershell ,依次敲入搞定1. $app = Get-SP ...

  10. DropDownList年份的添加

    http://blog.sina.com.cn/s/blog_4b9e030e01007sc3.html