code1213 解的个数 扩展欧几里得
2016-07-10 14:31
369 查看
很不错的题,加深了我对exgcd的理解
(以前我认为做题就是搜索、dp...原来数学也很重要)
理解了几个小时,终于明白了。但我什么都不打算写。
看代码吧:
(以前我认为做题就是搜索、dp...原来数学也很重要)
理解了几个小时,终于明白了。但我什么都不打算写。
看代码吧:
#include<iostream> using namespace std; int exgcd(int a,int b,int& x,int&y){//扩展欧几里得 if(b==0){ x=1; y=0; return a; } int x2,y2; int d=exgcd(b,a%b,x2,y2); x=y2; y=x2-(a/b)*y2; return d; } int main(){ int T; cin>>T; while(T--){ int a,b,c,lx,hx,ly,hy; cin>>a>>b>>c>>lx>>hx>>ly>>hy; c=-c; if(lx>hx||ly>hy||(a==0&&b==0&&c!=0)){cout<<0<<endl; continue;} if(a==0||b==0){ long long num_x,num_y; if(a==0)num_x=hx-lx+1; else if(c%a==0&&(c/a)<=hx&&(c/a)>=lx)num_x=1; else num_x=0; if(b==0)num_y=hy-ly+1; else if(c%b==0&&(c/b)<=hy&&(c/b)>=ly)num_y=1; else num_y=0; cout<<num_x*num_y<<endl; continue; } int x,y; int d=exgcd(a,b,x,y); if(c%d!=0){cout<<0<<endl; continue;} int k=c/d; x*=k; y*=k; a/=d; b/=d; // cout<<x<<' '<<y<<endl; if(x<lx){ while(x<lx){ x+=b; y-=a; } } else{ while(x>=lx){ x-=b; y+=a; } x+=b; y-=a; } long long ans=0; while(x<=hx){ if(y<=hy&&y>=ly){ ans++; // cout<<x<<' '<<y<<endl; } x+=b; y-=a; } cout<<ans<<endl; } }
相关文章推荐
- Oracle 常用命令
- 线段树专题(一)
- java synchronized详解
- Java Web学习(3):Win7 64位操作系统搭建Java Web开发环境
- [ZJOI2006]物流运输
- 《Maven实战》学习汇总
- 伪分布式安装Hadoop笔记
- Linux学习——crontab定时任务
- POJ3267 The Cow Lexicon(DP)
- 求出最小公倍数
- 单源最短路径-Bellman-ford算法
- Mahout Naive Bayes中文新闻分类示例
- ThinkPHP 模型(Model)命名规范
- 企业付款Openid
- JQ点击切换验证码
- iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期
- protect和private 的区别
- Qt_QTabWidget_多行
- uv纹理坐标设定与贴图规则
- Python之集合的用法