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

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. long long int x,y;
  5. long long int tot=;
  6. long long int a,b,c,p,q,r,s;
  7. long long int gcd(long long int a,long long int b)
  8. {
  9. if(b==)
  10. return a;
  11. else
  12. return gcd(b,a%b);
  13. }
  14. long long int exgcd(long long int a,long long int b,long long int & x,long long int & y)
  15. {
  16. if(b==)
  17. {
  18. x=;
  19. y=;
  20. return a;
  21. }
  22. long long int r=exgcd(b,a%b,x,y);
  23. long long int tmp;
  24. tmp=x;
  25. x=y;
  26. y=tmp-a/b*y;
  27. return r;
  28. }
  29. int main()
  30. {
  31.  
  32. int n;
  33. scanf("%d",&n);
  34. for(int i=;i<=n;i++)
  35. {
  36. tot=;
  37. //scanf("%lld %lld %lld %lld %lld %lld %lld",&a,&b,&c,&p,&q,&r,&s);
  38. cin>>a>>b>>c>>p>>q>>r>>s;
  39. c=-c;
  40. if((a==)&&(y<r||y>s))
  41. {
  42. printf("0\n");
  43. continue;
  44. }
  45. if((b==)&&(x<p||x>q))
  46. {
  47. printf("0\n");
  48. continue;
  49. }
  50.  
  51. if(p>q||r>s)
  52. {
  53. cout<<<<endl;
  54. continue;
  55. }
  56.  
  57. int gys=gcd(a,b);
  58. if(gys==)
  59. {
  60. if (c!=)
  61. {
  62. printf("0\n");
  63. continue;
  64. }
  65. else
  66. {
  67. tot=(q-p+)*(s-r+);
  68. printf("%lld\n",tot);
  69. continue;
  70. }
  71. }
  72. if(c%gys!=)
  73. {
  74. cout<<<<endl;
  75. continue;
  76. }
  77. exgcd(a,b,x,y);
  78. x=x*(c/gys);
  79. y=y*(c/gys);
  80. a=a/gys;
  81. b=b/gys;
  82. while(x>=p)
  83. {
  84. x=x-b;
  85. y=y+a;
  86. }
  87. while(x<p&&b!=)
  88. {
  89. x=x+b;
  90. y=y-a;
  91. }
  92. while(x>=p&&x<=q&&y>=r&&y<=s)
  93. {
  94. tot++;
  95. x=x+b;
  96. y=y-a;
  97. if(x<p||x>q||y<r||y>s)
  98. break;
  99. }
  100. printf("%lld\n",tot);
  101. }
  102.  
  103. return ;
  104. }

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. 正交表生成工具 PICT 成对组合覆盖 收藏

    收藏:https://www.cnblogs.com/wmjperson/p/4557246.html

  2. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  3. 树状数组【bzoj1103】: [POI2007]大都市meg

    1103: [POI2007]大都市meg 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡 ...

  4. kuangbin专题十六 KMP&&扩展KMP HDU3613 Best Reward(前缀和+manacher or ekmp)

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  5. mongoDB3.4安装

    添加官方yum源——mongodb3.4vim /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4] name=MongoDB Reposit ...

  6. Drop user 报ORA-00600 [KTSSDRP1]

    一客户删除一个数据库用户THH时报错: 说明在获取seg$时没有找到相应的条目,先来解释下这个600错误的参数含义: Arg [a] Tablespace number Arg [b] File nu ...

  7. (转)接口自动化测试之http请求实践总结

    一.接口测试的基本思路 1.确定要测试接口的请求类型.接口是get请求还是post请求. 2.确定接口的参数.需要传输的参数有哪些,类型分别是什么,都有哪些要求等. 3.按照参数要求构造请求需要的参数 ...

  8. dedecms中模板函数

    下面来解说下DEDECMS织梦CMS模板里面的函数说明 在文件include/inc_function.php里面 1 2 GetCurUrl() 获贴切前的脚本的URL 1 2 GetAlabNum ...

  9. Linux进程控制理论及几种常见进程间通信机制

    1. Linux进程控制理论 ① 进程是一个具有一定独立功能的程序的一次运行活动(动态性.并发性.独立性.异步性). 进程的四要素: (1)有一段程序供其执行(不一定是一个进程所专有的),就像一场戏必 ...

  10. Photoshop入门教程(五):滤镜

    学习心得:滤镜通常用于摄影行业,是安装在相机镜头前用于过滤自然光的附加镜头,从而获得一些特殊的效果.同理,Photoshop的滤镜也是为了产生特殊的效果.Photoshop滤镜分为两类:一种是内部滤镜 ...