| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 19826 | Accepted: 5299 |
Description
for (variable = A; variable != B; variable += C) statement;
Input
Output
Sample Input
3 3 2 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0
Sample Output
0 2 32766 FOREVER
Source
还是扩展欧几里得,这里注意要简化一下原来的式子
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 0x7fffffff
using 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ - 2115 - C Looooops (扩展欧几里得)
原文地址:http://blog.csdn.net/u014355480/article/details/47084159