1301. C 循环
考察要点:线性同余方程 扩展gcd
题目要求
对于 C 语言的循环语句,形如:
for (variable = A; variable != B; variable += C)
statement;
请问在 k 位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。否则输出死循环。
输入格式
多组数据,每组数据一行四个整数 A,B,C,k。
读入以 0 0 0 0 结束。
输出格式
若在有限次内结束,则输出循环次数。
否则输出 FOREVER。
数据范围
1≤k≤32,
0≤A,B,C<2k
输入样例:
3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0
输出样例:
0
2
32766
FOREVER
题目地址:https://www.acwing.com/problem/content/1303/
解析:
代码思路 :利用扩展欧几里得方程求解系数,在进行相应的匹配,求出x。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
LL exgcd(LL a, LL b, LL &x, LL &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main()
{
LL a, b, c, k;
while(cin >> a >> b >> c >> k, a || b || c || k)
{
LL x, y;
LL z = 1ll << k; //这里是1 LL 左移 K 位(2^K)
LL d = exgcd(c, z, x, y);
if((b - a) % d) cout << "FOREVER" << endl; //b-a如果不是d的倍数那么就是无解的
else{
x *= (b - a) / d; //求出x次数
z /= d;
cout << (x % z + z) % z << endl; //%z求出最小x 防止x%z有负数
}
}
return 0;
}
本题:1301. C 循环
代码参考:视频讲解