POJ 2115 C Looooops

来源:互联网 发布:2017福利彩票中奖软件 编辑:程序博客网 时间:2024/06/02 19:54
C Looooops
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 17953 Accepted: 4680

Description

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

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. 

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


题目大意:给你A,B,C,K,四个数字,A,B,C,相当于for (variable = A; variable != B; variable += C),K是一个代表多少位的二进制的数。让你求运行多少次循环结束。

思路:欧几里得拓展算法。

#include <stdio.h>long long a, b, c, k, x, y;long long gcd(long long a, long long b)//拓展的欧几里得算法{    if (b ==0)    {        x =1;        y =0;        return a;    }    long long d = gcd(b, a % b);    long long t = x;    x = y;    y = t - a / b * y;    return d;}int main(){    while (~scanf("%I64d%I64d%I64d%I64d", &a, &b, &c, &k))    {        if(a + b + c + k == 0)            break;        long long t = b - a;        long long h =1;        h <<= k;    //计算2的K次方        long long g = gcd(c, h);        if (t % g !=0)   //如果不能整除则无整数解,则循环不会停止        {            printf("FOREVER\n");            continue;        }        x *= t / g;        x = (x % (h / g) + (h / g)) % (h / g);        printf("%I64d\n", x);    }    return 0;}


0 0
原创粉丝点击