C Looooops(扩展欧几里德)
2015-10-29 22:01
281 查看
C Looooops
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)Total Submission(s) : 10 Accepted Submission(s) : 3
[align=left]Problem Description[/align]
A Compiler Mystery: We are given a C-language style for loop of type
for (variable = A; variable != B; variable += C) statement;
I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing the variable by C. We want to know how many times does the statement get executed for particular values of A, B and C, assuming that all arithmetics is calculated in a k-bit unsigned integer type (with values 0 <= x < 2k) modulo 2k.
[align=left]Input[/align]
The input consists of several instances. Each instance is described by a single line with four integers A, B, C, k separated by a single space. The integer k (1 <= k <= 32) is the number of bits of the control variable of the loop and A, B, C (0 <= A, B, C < 2k) are the parameters of the loop.
The input is finished by a line containing four zeros.
[align=left]Output[/align]
The output consists of several lines corresponding to the instances on the input. The i-th line contains either the number of executions of the statement in the i-th instance (a single integer number) or the word FOREVER if the loop does not terminate.
[align=left]Sample Input[/align]
3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0
[align=left]Sample Output[/align]
0
2
32766
FOREVER
题解:
输出lld老是wa,改成I64就过了。。。还有(LL)1<<k,也要加LL,否则还会wa
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; typedef long long LL; void e_gcd(LL a,LL b,LL &d,LL &x,LL &y){ if(!b){ d=a; x=1; y=0; } else{ e_gcd(b,a%b,d,x,y); LL temp=x; x=y; y=temp-a/b*y; } } void cal(LL a,LL b,LL c){ LL d,x,y; e_gcd(a,b,d,x,y); if(c%d!=0){ puts("FOREVER"); return; } x*=c/d; b/=d; if(b<0)b=-b; x%=b; if(x<0)x+=b; printf("%I64d\n",x); return; } int main(){ LL A,B,C,k; while(~scanf("%lld%lld%lld%lld",&A,&B,&C,&k),A|B|C|k){ //C*x+2^ky=B-A; cal(C,(LL)1<<k,B-A); } return 0; }
相关文章推荐
- linux笔记:文件处理命令touch,cat,more,less,head,tail
- 一台主机利用apache服务器开启虚拟主机后无法使用www域名解决方法
- Linux中环境变量文件及配置
- Linux学习一天一个命令(1)[ls命令]
- linux查看日志文件内容命令tail、cat、tac、head、echo
- Hadoop 运行 Wordcount程序
- openstack组件oslo.message之RPCServer实现
- linux多线程的创建基本知识
- 什么是网站地图
- ubuntu+nginx+php+mysql安装配置方法命令
- Nginx之——413 修改上传文件大小限制
- Windows连接Linux的常用工具
- CentOS 7.1 下载,安装,配置
- synopsys verdi2014-03安装破解过程
- Linux Postgresql 安装,使用
- 开源还是商用?十大云运维监控工具横评
- linux笔记:目录处理命令ls,mkdir,cd,pwd,rmdir,cp,mv,rm
- CentOS系统下xinetd启动问题
- Nginx缓存配置及nginx ngx_cache_purge模块的使用
- OpenResty—专注高性能服务开发