#3989. C Looooops

    ID: 3989 传统题 1000ms 16MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>扩展欧基里德定理信息学奥赛之数学一本通习题1.11.5

C Looooops

题目描述

编译器之谜:我们提供了一种C语言风格的for循环,类型为:

for (variable = A; variable != B; variable += C)
  statement;

即,一个循环开始时将变量值设置为值AA,当变量不等于BB时,重复执行语句并使变量增加CC

我们想知道在特定ABA、BCC的值下,该语句被执行了多少次,假设所有的算术运算都是在kk位无符号整数类型中进行(其值范围为0x<2k0 \le x < 2^k),模数为2k2^k

以上题意可以简化为:

给出A,B,C,kA,B,C,k,求XX,使得(A+CX)(A+C*X)%2k=B2^k=B

输入格式

输入包含多个实例。

每个实例由一行描述,其中包含四个整数A,B,C,kA, B, C, k,它们之间用一个空格隔开。整数kk1k321 \le k \le 32)是循环控制变量的位数,而A,B,C0A,B,C<2kA, B, C(0 \le A, B, C < 2^k)是循环的参数。

输入以一行包含四个零的行结束。

输出格式

输出包含几行,每行对应输入中的一个实例。

ii行包含第ii个实例中语句执行的次数(一个整数),如果循环不终止,则输出单词FOREVER。

样例

3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0
0
2
32766
FOREVER

数据范围

  • 1k321 \le k \le 32
  • 0A,B,C<2k0 \le A, B, C < 2^k

来源

  • poj2115
  • 信息学奥赛之数学一本通
  • stong9070整理