和五指山那题目基本相同、那道题我应该写了稍微详细一点的题解,是关于x1、y1、x2、y2的关系的。
import java.util.*;
//variable = A
//while(variable != B)
//variable += C
public class Main{
static long x2;//用来保存下一层递归的结果
static long y2;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
long A = input.nextLong();
long B = input.nextLong();
long C = input.nextLong();
long k = input.nextLong();
while(A != 0 || B != 0 || C != 0 || k != 0){
// System.out.printf("%d %d %d %d \n",A,B,C,k);
if(A == B){
System.out.println(0);
}else{
//3 7 2 16
long a = C;
long b = (1L << k);
long gcd = extGcd(a,b);
// System.out.printf("%d * %d + %d * %d = %d \n",x2,a,y2,b,gcd);
if((B - A) % gcd != 0){
System.out.println("FOREVER");
}else{
//x2 * C + y2 * (1 << k) = (B - A)
x2 *= (B - A) / gcd;
//实际上通解的形式是+号左边加上一个最小公倍数数,加号右边减去一个最小公倍数
//因为是最小公倍数,所以是最小的能同时使用原数a、b表示的数,每次加上一个最小增量即是通解
b /= gcd;// a * b / gcd最小公倍数 a * (x + k * b / gcd )为通解
// System.out.println("x2:"+x2+" b:"+b);
long res = (x2 % b + b) % b;
System.out.println(res);
}
}
A = input.nextLong();
B = input.nextLong();
C = input.nextLong();
k = input.nextLong();
}
}
public static long extGcd(long a,long b){
if(b == 0){
x2 = 1;
y2 = 0;
return a;
}
long gcd = extGcd(b,a%b);
long x1 = y2;
long y1 = x2 - (a / b) * y2;
x2 = x1;//我老是忘了更新x2,y2。
y2 = y1;
return gcd;
}
}
想问一下为啥
这个 b / d 表示的是什么呀?