POJ2115 C Looooops 解一元线性同余方程
2015-06-05 15:45
309 查看
题目链接:http://poj.org/problem?id=2115
题目大意:有代码段for(variable=A;variable!=B;variable+=C) statement;已知所用到数都是mod 2^k的数,问你statement语句一共执行了多少次,如果循环为死循环,输出FOREVER.
分析:同余方程求解 相当于求A+Cx≡B(mod 2^k)的最小正整数解x。
实现代码如下:
题目大意:有代码段for(variable=A;variable!=B;variable+=C) statement;已知所用到数都是mod 2^k的数,问你statement语句一共执行了多少次,如果循环为死循环,输出FOREVER.
分析:同余方程求解 相当于求A+Cx≡B(mod 2^k)的最小正整数解x。
实现代码如下:
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; LL a,b,d,m,x,y; void exgcd(LL a,LL b,LL &d,LL &x,LL &y) {//扩展欧几里得算法 if(!b) { x=1,y=0,d=a; return ; } else { exgcd(b,a%b,d,x,y); LL temp=x; x=y; y=temp-(a/b)*y; } } int main() { LL k,c; while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k)) { if(a==0&&b==0&&c==0&&k==0) break; m=(LL)1<<k; b=b-a; a=c; exgcd(a,m,d,x,y); if(b%d) puts("FOREVER"); else { x=x*(b/d)%m; //方程ax=b(mod m)的最小解 x=(x%(m/d)+m/d)%(m/d); //方程ax=b(mod m)的最小整数解 printf("%lld\n",x); } } return 0; }
相关文章推荐
- Linux系统下使用mail发送一封简单的Internet邮件【以及验证邮件是否发送成功sendmail -bp,必须是root用户才可以使用此命令查看邮件消息队列中的内容】
- APACHE 2.2.8+TOMCAT6.0.14配置负载均衡
- OpenXmlSdk导出Excel
- linux mail命令用法浅析【用最简单的测试一下就可以了如 "mail 真实的邮箱账号"具体操作见下一篇文章】
- CentOS6.5解决中文乱码与设置字符集
- tomcat服务器启动报错
- 二、使用find和xargs
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
- linux 开发板(busybox命令)设置时间
- OpenGL ES 2.0 Shader
- 异构系统架构标准——HSA
- IE11之F12 Developer Tools--调试器(Debugger)
- 【Linux Tips】登陆,提示符,别名
- PowerShell实现批量收集SCVMM中虚拟机IP-续
- 【openstack】openstack的调度(Scheduler)
- Linux 文件传输客户端SSH Secure Shell Client
- 关于文件与文件系统的压缩与打包命令-Linux(笔记)
- linux复习笔记-获取帮助
- log4j:WARN Please initialize the log4j system properly
- CentOS6搭建本地局域网YUM源