Solutions to an Equation LightOJ
来源:互联网 发布:网络安全法答题 编辑:程序博客网 时间:2024/05/22 08:19
题面
题意
Ax + By + C = 0,给出A,B,C和x1,x2,y1,y2,其中x1<=x<=x2且y1<=y<=y2,那么该方程一共有几组整数解
方法
欧扩
一开始先特判a,b中有0的情况
难点之一在于a,b可以为负数,故在进行一系列操作之前先将符号存起来,因为符号不影响数值的绝对值大小,为了更加方便,可以先算出一组解的绝对值,再枚举4种符号匹配方式,找到使等式成立的哪一种情况.
利用欧扩可以求出ax+by=1的一组解,若该方程有解则gcd(a,b)为c的约数,因而我们可以先约去一个gcd(a,b)使a,b互质,然后利用欧扩解出a’x+b’y=1,这时的x,y同时乘上gcd(a,b)即为原方程的解,我定义这组解为x1,y1.
不难发现下述规律(k为任意整数):
x=x1+k*(b/gcd(a,b)).
y=y1+k*(a/gcd(a,b)).
因而可以根据这两个规律求出最大k和最小k,作差加一后即为答案.注意a,b在解出一组解后要还原符号位.
在解最后的k时,还要根据b/gcd(a,b)和a/gcd(a,b)的正负进行讨论.
同时也应注意是向上取整还是,向下取整.
代码
#include<bits/stdc++.h>#define ll long long#define db doubleusing namespace std;ll T,TT,a,b,c,xd,xu,yd,yu,bx,by,g,x,y,fh1[]={1,1,1,-1,-1},fh2[]={1,1,-1,1,-1},m1,m2,n1,n2,f1,f2;ll gcd(ll u,ll v){ while(u!=v&&u&&v) { if(u>v) u%=v; else v%=u; } return max(u,v);}ll ny(ll u,ll v){ if(v) { ll k=ny(v,u%v); x-=(u/v)*y; swap(x,y); return k; } else { x=1; y=0; return u; }}int main(){// freopen("1.txt","r",stdin);// freopen("2.txt","w",stdout); ll i,j; cin>>T; TT=T; while(T--) { ll ans=0; scanf("%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&xd,&xu,&yd,&yu); c=-c; printf("Case %lld: ",TT-T); if(!a&&!b) { if(!c) printf("%lld\n",(xu-xd+1)*(yu-yd+1)); else printf("0\n"); continue; } if(!a) { if(c%b==0&&c/b>=yd&&c/b<=yu) printf("%lld\n",xu-xd+1); else printf("0\n"); continue; } if(!b) { if(c%a==0&&c/a>=xd&&c/a<=xu) printf("%lld\n",yu-yd+1); else printf("0\n"); continue; } f1=a/abs(a);a=abs(a); f2=b/abs(b);b=abs(b); g=gcd(a,b); if(abs(c)%g!=0) { printf("0\n"); continue; } a/=g; b/=g; ny(a,b); a*=f1; b*=f2; a*=g; b*=g; x*=c/g; y*=c/g; for(i=1;i<=4;i++) { if(fh1[i]*x*a+fh2[i]*y*b==c) { x*=fh1[i]; y*=fh2[i]; break; } }// cout<<a<<' '<<b<<" "<<g<<endl; bx=b/g; by=-a/g;// cout<<x<<" "<<y<<" "<<bx<<" "<<by<<endl; if(bx>0) { m1=(ll)ceil((db)(xd-x)/(db)bx); m2=(ll)floor((db)(xu-x)/(db)bx); } else { m1=(ll)ceil((db)(xu-x)/(db)bx); m2=(ll)floor((db)(xd-x)/(db)bx); } if(by>0) { n1=(ll)ceil((db)(yd-y)/(db)by); n2=(ll)floor((db)(yu-y)/(db)by); } else { n1=(ll)ceil((db)(yu-y)/(db)by); n2=(ll)floor((db)(yd-y)/(db)by); }// cout<<m1<<" "<<m2<<" "<<n1<<" "<<n2<<endl; printf("%lld\n",max((ll)0,min(m2,n2)-max(m1,n1)+1)); }}
阅读全文
1 0
- Solutions to an Equation LightOJ
- LightOJ 1306 Solutions to an Equation
- d224: 11296 - Counting Solutions to an Integral Equation
- UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
- Solutions: Using Mac OSX Terminal as an alternative to PuTTY
- A proof of an equation
- Solutions to big data
- Jordan Lecture Note-6: The Solutions of Nonlinear Equation.
- 论文阅读:Reboots are for Hardware: Challenges and Solutions to Updating an Operating System on the Fly
- FZU 1909 An Equation 解题报告
- fzu 1909 An Equation(水题)
- LightOj 1110 An Easy LCS
- LightOJ 1110 An Easy LCS
- Where to Run LightOJ
- solutions
- Solutions to Software Engineering Foundation-PartⅠ
- Solutions to Software Engineering Foundation-PartⅡ
- Solutions to <Learning jQuery> Chapter 3
- OpenCV坐标系与操作像素的四种方法
- TextView 和 EditText 的 DrawableRight 点击事件的处理
- "无限"弹出窗口的网址是如何实现的?
- 非负矩阵分解算法——Daniel D.Lee and H.Sebastian Seung论文翻译
- [ArcGIS] 空间分析(八) 水文分析
- Solutions to an Equation LightOJ
- windows下运行exe CreateProcess 和 ShellExecute
- [Unity][unet][Android]电脑和电脑发送信息交互通讯
- Hibernate之Api
- linux虚拟机中单机版redis配置
- Java集合基础知识-List
- JAVA编程思想笔记--复用类
- Hellowmas
- linux挂载SD卡