好题、趣题、麻烦题

  sgu 106:

  这道题首先让我们解一个线性方程式ax+by=-c,用拓展欧几里得就可以搞定。但是它要求我们需要输出满足x1<=x<=x2,y1<=y<=y2的解的个数,这可就没那么简单了...

  我一开始想记录x和y的边界值,但想了好久,分了n多种情况...因为太繁琐,最后索性放弃分情况,交了一发WA了。

  看了某人的解题报告后,发现原来可以求满足x1<=x0+k*r1<=x2,y1<=y0-k*r2<=y2的k的个数。r1=lcm/a,r2=lcm/b,lcm=a*b*gcd(a,b)。

  然后解解方程,算算区间相交长度就行了。

  (ceil和floor函数要#include <cmath>,而cmath里有名字叫y1的函数,真蛋疼。不过其实只要把y1从全局拿到main函数内部就好)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #define debug(x) cout<<#x<<" = "<<x<<endl
 5 using namespace std;
 6 typedef long long LL;
 7
 8 LL gcd(LL a,LL b)
 9 {
10     LL temp;
11     if (a<0) a=-a; if (b<0) b=-b;
12     while (b!=0) { temp=b; b=a%b; a=temp; }
13     return a;
14 }
15 //传入的a,b要保证是互质的(因为最后a*1+b*0=1时要保证a为1)
16 void _gcd(LL a,LL b,LL &x,LL &y)
17 {
18     if (b==0) { x=1,y=0; return; }
19     _gcd(b,a%b,x,y);
20     LL temp=y;
21     y=x-a/b*y; x=temp;
22 }
23 int main()
24 {
25 LL a,b,c,x1,x2,y1,y2;
26 LL x,y;
27 LL tx1,tx2,ty1,ty2;
28     cin>>a>>b>>c>>x1>>x2>>y1>>y2;
29     LL r=gcd(a,b),r1,r2;
30     if (a==0&&b==0)
31     {
32         if (c==0) cout<<(x2-x1+1)*(y2-y1+1)<<endl;
33         else cout<<0<<endl;
34     }
35     else if (a==0||b==0)
36     {
37         if (a==0) swap(a,b),swap(x1,y1),swap(x2,y2);
38         if (c%a!=0) cout<<0<<endl;
39         else if (-c/a>=x1&&-c/a<=x2) cout<<(y2-y1+1)<<endl;
40         else cout<<0<<endl;
41     }
42     else if (c%r!=0) printf("0\n");
43     else
44     {
45         _gcd(a/r,b/r,x,y);
46         x*=-c/r; y*=-c/r;
47         r=a*b/r; r1=r/a; r2=r/b;
48         tx1=x1-x; tx2=x2-x; if (r1<0) swap(tx1,tx2),tx1=-tx1,tx2=-tx2,r1=-r1;
49         ty1=-y2+y; ty2=-y1+y; if (r2<0) swap(ty1,ty2),ty1=-ty1,ty2=-ty2,r2=-r2;
50         tx1=ceil(double(tx1)/r1); tx2=floor(double(tx2)/r1);
51         ty1=ceil(double(ty1)/r2); ty2=floor(double(ty2)/r2);
52         tx1=max(tx1,ty1); tx2=min(tx2,ty2);
53         if (tx2>=tx1) cout<<tx2-tx1+1<<endl;
54         else cout<<0<<endl;
55     }
56     return 0;
57 }

The equation

时间: 2024-08-25 21:54:13

好题、趣题、麻烦题的相关文章

c#认证题第一单元 1题 11题.

第一题: 第11题:

一天一道算法题---6.8--数学题

感谢微信平台:一天一道算法题---每天多一点进步----明天 考离散了 明天 高考结束了 看上去都是 好日子..... 上题目了: 求出用1 , 2 ,5这三个数不同个数的组合的和为100的组合个数. 如:100个1是一个组合:5个1+19个5是一个组合 OK:--- 几天折磨后 终于来了个 我能做的.... PS:  关于6.7--栈中O(1)实现min函数等的  应该会在今晚贴上.. 平台上关于这题的分析很到位: 设 1的个数为X 2的个数为Y 5的个数为Z 和为100的组合总数为cnt 1

第二题、第三题、第四题

1.以编程方式操作 HttpCachePolicy 类. HttpCachePolicy.SetExpires HttpCachePolicy.SetCacheability |NoCache|Private|Public|Server|ServerAndNoCache |ServerAndPrivate 2<%@ OutputCache Duration="60" VaryByParam="None" %>Duration 和 VaryByParam

【BZOJ1061】【NOI2008】志愿者招募 费用流神题、单纯形裸题(代码费用流)

题目模型出的真心神. 需要好难才能推出来. 本来打算写一篇好的题解,但是状态实在不好,没弄会这道题. 只能先扒建边留个坑了. 据说"单纯形算法"可以高速+裸建图 水过此题(呃,或曰此题乃单纯形裸题是也.) 留坑前先给个链接吧,应该是目前网上最好的此题题解: BYV大神的题解:www.byvoid.com/blog/noi-2008-employee/#more-916 我的代码: <span style="font-family:KaiTi_GB2312;font-si

poj水题-3062 超级水题的深层理解——代码简化

题目很简单,要求输入什么样输出什么样.以回车结束 这就是我用的C代码 #include <stdio.h> int main (){char p;for(;gets(&p);)puts(&p);return 0;} 使用了代码简化方案,我简化到了75B.有大神简化到31B,真想看看他们的源代码.我估计他们比我个能够了解语言规则. 这里不得不说一本叫<短码之美>的书.介绍了这道题.但我试过了,没用.可能系统升级了吧,必须要求C99. ,还听说不用#include也行,

一天一道算法题--6.5--数学题

感谢 微信平台: 一天一道算法题 ---每天多一点进步---- 话说 这题 我百度了一下 没找到哪个OJ 有出这题 下次 来给我们的学弟学妹们把.... 那我来说下题目大意: 给你一个n 问你从1,2,3--n中选出3个数 能够构成多少种不同的三角形 比如N=5 可以有(2,3,4)(2,3,5)(3,4,5)三种 输入:(3<=n<=n1000000) 输出:种类数 首先 既然是做acm 那么 一般暴力 都直接放弃吧 这里也需要O(n^3)  GG 这里 微信提供的分析 很好  我相信 你慢

经典算法题每日演练——第九题 优先队列

原文:经典算法题每日演练--第九题 优先队列 前端时间玩小爬虫的时候,我把url都是放在内存队列里面的,有时我们在抓取url的时候,通过LCS之类的相似度比较,发现某些url是很重要的, 需要后端解析服务器优先处理,针对这种优先级比较大的url,普通的队列还是苦逼的在做FIFO操作,现在我们的需求就是优先级大的优先服务,要做 优先队列,非堆莫属. 一:堆结构 1:性质 堆是一种很松散的序结构树,只保存了父节点和孩子节点的大小关系,并不规定左右孩子的大小,不像排序树那样严格,又因为堆是一种完全二叉

经典算法题每日演练——第一题 百钱买百鸡

原文:经典算法题每日演练--第一题 百钱买百鸡 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, 用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 分析:估计现在小学生都能手工推算这套题,只不过我们用计算机来推算,我们可以设公鸡为x,母鸡为y,小鸡为z,那么我们 可以得出如下的不定方程, x+y+z=100, 5x+3y+z/3=100, 下面再看看x,y,z的取值范围. 由于只

经典算法题每日演练——第二题 五家共井

原文:经典算法题每日演练--第二题 五家共井 古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠,皆及. 意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水:乙家的绳子用三条不够,还要再用丙家的绳子 一条才能打到井水:丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水:丁家的绳子用五条不够,还要再用戊家的绳子一条才能打

一天一道算法题--6.18--思维题

感谢微信平台---一天一道算法题---每天多一点进步---- problem: 给你一天的Google搜索日志 你怎么设计算法找出是否有一个搜索词 它出现的频率占所有搜索的一半以上?如果肯定有一个搜索词栈大多数 你能这么提高你的算法找到它?再假设搜索日志就是内存中的一个数组 要求O(1)空间 O(n) 时间的算法 analyse: 这题来源于google面试 而且这题真的很有意思.......... 这个分析 也真的好长啊 我也基本懂了 还是 明天 继续码吧 今天 主要来开个头 不然怕又被拖着了