uva 10548 - Find the Right Changes(拓展欧几里得)
2014-09-18 17:00
316 查看
题目链接:uva 10548 - Find the Right Changes
题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解。
解题思路:拓展欧几里得,保证x,y均大于等于0,确定通解中t的取值。
题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解。
解题思路:拓展欧几里得,保证x,y均大于等于0,确定通解中t的取值。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f; ll A, B, C; void gcd (ll a, ll b, ll& d, ll& x, ll& y) { if (b == 0) { d = a; x = 1; y = 0; } else { gcd(b, a%b, d, y, x); y -= (a/b) * x; } } void solve () { ll d, x, y; gcd(A, B, d, x, y); if (C % d) { printf("Impossible\n"); return; } ll up = INF, lower = -INF; if (B / d > 0) lower = max(lower, (ll)ceil( (-1.0*x*C) / B) ); else up = min(up, (ll)floor( (-1.0*x*C) / B) ); if (A / d > 0) up = min(up, (ll)floor( (1.0*y*C) / A)); else lower = max(lower, (ll)ceil( (1.0*y*C) / A)); if (up == INF || lower == -INF) printf("Infinitely many solutions\n"); else if (up < lower) printf("Impossible\n"); else printf("%lld\n", up - lower + 1); } int main () { int cas; scanf("%d", &cas); while (cas--) { scanf("%lld%lld%lld", &A, &B, &C); solve(); } return 0; }
相关文章推荐
- uva 10548 - Find the Right Changes(拓展欧几里得)
- UVA 10548 - Find the Right Changes(数论)
- codeforces A. The Monster 拓展欧几里得解决等差数列最小公共值
- uva 10413 - Crazy Savages(拓展欧几里得)
- The Right Tip [UVA 1163]
- POJ2945 UVALive3527 Find the Clones【字符串排序】
- Uva10673 Play with Floor and Ceil(拓展欧几里得)
- UVALive - 2701 Find The Multiple
- UVA 11077 Find the Permutations
- UVA 10673 Play with Floor and Ceil(拓展欧几里得)
- UVa10219 - Find the ways !
- Disgruntled Judge UVA - 12169 (暴力或者拓展欧几里得)
- UVA 4683 - Find The Number
- UVA 11077 Find the Permutations(置换)
- Ranger UI报错:Defective token detected (Mechanism level: GSSHeader did not find the right tag)
- Disgruntled Judge UVA - 12169 (暴力或者拓展欧几里得)
- UVA - 11077 Find the Permutations (置换)
- Uva 11077 Find the Permutations [置换群 DP]
- uva11077 Find the Permutations
- uva 1340 - Find the Border(卷包裹)