C Looooops(poj 2115)
2016-07-05 21:10
429 查看
大致题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
解题思路:
题意不难理解,只是利用了 k位存储系统 的数据特性进行循环。
例如int型是16位的,那么int能保存2^16个数据,即最大数为65535(本题默认为无符号),
当循环使得i超过65535时,则i会返回0重新开始计数
如i=65534,当i+=3时,i=1
其实就是 i=(65534+3)%(2^16)=1
有了这些思想,设对于某组数据要循环x次结束,那么本题就很容易得到方程:
x=[(B-A+2^k)%2^k] /C
即 Cx=(B-A)(mod 2^k) 此方程为 模线性方程,本题就是求X的值。
View Code
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
解题思路:
题意不难理解,只是利用了 k位存储系统 的数据特性进行循环。
例如int型是16位的,那么int能保存2^16个数据,即最大数为65535(本题默认为无符号),
当循环使得i超过65535时,则i会返回0重新开始计数
如i=65534,当i+=3时,i=1
其实就是 i=(65534+3)%(2^16)=1
有了这些思想,设对于某组数据要循环x次结束,那么本题就很容易得到方程:
x=[(B-A+2^k)%2^k] /C
即 Cx=(B-A)(mod 2^k) 此方程为 模线性方程,本题就是求X的值。
//注意最后使x变为最小正整数的公式 #include<cstdio> #include<iostream> #define ll long long using namespace std; ll A,B,C,K; ll e_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1;y=0; return a; } ll r=e_gcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y; return r; } int main() { while(1) { cin>>A>>B>>C>>K; if(A==0&&B==0&&C==0&&K==0)break; if(A==B) { printf("0\n"); continue; } ll a=C,b=1LL<<K,c=B-A,x,y; ll gcd=e_gcd(a,b,x,y); if(c%gcd) { printf("FOREVER\n"); continue; } x=x*c/gcd; x=(x%(b/gcd)+(b/gcd))%(b/gcd); cout<<x<<endl; } }
View Code
相关文章推荐
- 为什么apache要设置虚拟主机
- [bzoj4098] [Usaco2015 Open]Palindromic Paths
- jvisualvm远程监控Tomcat
- 关于安装tomcat启动的一些问题
- MapReduce程序的3种集群提交运行模式详解---基于Windows与Linux两种开发环境
- shell脚本:脚本分析汇总ping日志文件
- Hadoop 2.6.4单节点集群配置
- zabbix
- shell脚本:mysql全备与binlog增量备份
- shell脚本:nginx访问日志切割与打包上传
- maven依赖关系中Scope的作用
- new Linux git setting
- shell脚本:日志切割与上传
- shell脚本:检查ftp日志存储服务器上的日志是否正常上传
- centos7.1下 Docker环境搭建
- Hadoop2.6.0伪分布环境搭建
- ReturnType operator "" _suffix(Type t){Method's Body}
- Linux进程通信
- ubuntu14.04下hadoop2.6.0安装
- CentOS6.5 安装CPAN,从而安装perl的各种模块