POJ - 2115 - C Looooops (扩展欧几里得)
来源:互联网 发布:阜宁县网络发言人平台 编辑:程序博客网 时间:2024/05/16 18:35
C Looooops
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 19826 Accepted: 5299
Description
A Compiler Mystery: We are given a C-language style for loop of type
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.
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.
Input
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.
The input is finished by a line containing four zeros.
Output
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.
Sample Input
3 3 2 163 7 2 167 3 2 163 4 2 160 0 0 0
Sample Output
0232766FOREVER
Source
CTU Open 2004
还是扩展欧几里得,这里注意要简化一下原来的式子
AC代码:
#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;LL gcd(LL a, LL b) {return b == 0 ? a : gcd(b, a % b);}void exgcd(LL a, LL b, LL& x, LL& y) {if(b == 0) {x = 1; y = 0;}else {exgcd(b, a % b, y, x);y -= x * (a / b);}}int main() {LL A, B, C, k;while(scanf("%I64d %I64d %I64d %I64d", &A, &B, &C, &k) != EOF) {if(A == 0 && B == 0 && C == 0 && k == 0) break;if(A == B) {printf("0\n");continue;}LL a = C;LL b = (1LL << k);LL c = gcd(a, b);LL d = B - A;if(d % c != 0) {printf("FOREVER\n");continue;}a /= c;//这里要进行简化,因为可能产生多余的次数 b /= c;d /= c;LL p, q;exgcd(a, b, p, q);//这里求的是最简ax+by=gcd(a,b)的一组x,y的解 printf("%I64d\n", (p * (d / gcd(a, b)) % b + b) % b);}return 0;}
0 0
- poj-2115 C Looooops(扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得)
- POJ - 2115 - C Looooops (扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- POJ-2115-C Looooops(扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得)
- 【POJ】2115 - C Looooops(扩展欧几里得)
- POJ 2115 C Looooops (扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- poj 2115 C Looooops(扩展欧几里得)
- POJ 2115 C Looooops 扩展欧几里得算法
- poj 2115 C Looooops 扩展欧几里得
- poj 2115 C Looooops 【扩展欧几里得】
- POJ 2115 C Looooops (扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得算法)
- C Looooops poj 2115 扩展欧几里得
- [poj 2115] C Looooops 扩展欧几里得
- 关于iOS push一些问题的理解
- HDU 1232 畅通工程
- 测试人员如何减少产品的遗留bug
- Spark Streaming 流计算优化记录(3)-控制流量与join的地点
- Android完全退出程序
- POJ - 2115 - C Looooops (扩展欧几里得)
- 暑假习题 五
- 图像分割(大律法 OSTU法)
- 新特性
- 挂载ubifs文件系统分区
- 2015年 苹果开发者/邓氏编码 账户申请
- STM32F4——GPIO基本应用及复用
- Lua笔记2-开始
- android底部弹出菜单