poj 2115 C Looooops (扩展欧几里得算法)
2016-03-07 13:41
344 查看
题意:对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
参考资料:
http://www.acmerblog.com/extend-gcd-5610.html
/article/1968938.html
若在有限次内结束,则输出循环次数。
否则输出死循环。
参考资料:
http://www.acmerblog.com/extend-gcd-5610.html
/article/1968938.html
#include <iostream> #include <stdio.h> using namespace std; //d=ax+by,其中最大公约数d=gcd(a,n),x、y为方程系数,返回值为d、x、y __int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y) { if(b==0) { x=1; y=0; return a; //d=a,x=1,y=0,此时等式d=ax+by成立 } __int64 d=EXTENDED_EUCLID(b,a%b,x,y); __int64 xt=x; x=y; y=xt-a/b*y; //系数x、y的取值是为满足等式d=ax+by return d; } int main(void) { __int64 A,B,C,k; while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k)) { if(!A && !B && !C && !k) break; __int64 a=C; __int64 b=B-A; __int64 n=(__int64)1<<k; //2^k __int64 x,y; __int64 d=EXTENDED_EUCLID(a,n,x,y); //求a,n的最大公约数d=gcd(a,n)和方程d=ax+by的系数x、y if(b%d!=0) //方程 ax=b(mod n) 无解 cout<<"FOREVER"<<endl; else { x=(x*(b/d))%n; //方程ax=b(mod n)的最小解 x=(x%(n/d)+n/d)%(n/d); //方程ax=b(mod n)的最整数小解 printf("%I64d\n",x); } } return 0; }
相关文章推荐
- 【转】浅谈MVC与三层架构
- linux查看磁盘空间
- 我所理解的网站架构
- Tomcat 默认支持的处理请求的并发数量
- 使用PowerShell下载文件
- How To Install Zabbix Server On CentOS 7
- Linux解压/压缩命令总结
- 嵌入式 armlinux内核编译注意事项
- apache,nginx.iis 从写规则转换
- Linux内核编译与裁剪(ARM版)
- CentOS 7安装MySQL
- Prometheus监控 - Alertmanager报警模块
- opencart框架分析与概况
- 【Nginx】事件和连接
- Linux下创建与解压tar, tar.gz和tar.bz2文件及压缩率对比 | 沉思小屋
- Linux 病毒跑满带宽处理
- Apache POI读写Excel文档入门(支持XLS和XLSX格式)
- 配置hadoop集群问题
- 推荐几个好玩又有难度的编程网站
- 启动Mediation_Function失败及解决方案