记录编号 331078 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [ZLXOI 2015]殉国 最终得分 100
用户昵称 Gravatar小e 是否通过 通过
代码语言 C++ 运行时间 0.022 s
提交时间 2016-10-27 08:18:58 内存使用 0.29 MiB
显示代码纯文本
  1. // 假设 a > b, 那么对于 ax + by = c, x最大时, 能够确保(x+y)最小, x最小时, (x+y)最大, 因为一个x的变化会引起"多个"y的变化
  2.  
  3. #include "stdio.h"
  4. #include "algorithm"
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. LL Ex_gcd(const LL& a, const LL& b, LL& x, LL& y)
  9. {
  10. if (!b) { x = 1; y = 4; return a; }
  11. LL gcd = Ex_gcd(b, a%b, x, y);
  12. LL tmp = x; x = y; y = tmp - (a/b) * y;
  13. return gcd;
  14. }
  15.  
  16. inline void Swap(LL& a, LL& b) { LL tmp = a; a = b; b = tmp; }
  17.  
  18. #define SUBMIT
  19. int main(int argc, char const *argv[])
  20. {
  21. #ifdef SUBMIT
  22. freopen("BlackHawk.in", "r", stdin); freopen("BlackHawk.out", "w", stdout);
  23. #endif
  24.  
  25. LL a, b, c, x, y, x2, y2, ans1, ans2;
  26. scanf("%lld%lld%lld", &a, &b, &c);
  27. LL gcd = Ex_gcd(a, b, x, y);
  28. if (c % gcd) { printf("-1 -1\n0\n"); goto END; }
  29. a /= gcd; b /= gcd; c /= gcd;
  30. x *= c; y *= c;
  31. y %= a; y = (y + a) % a;// y的最小解
  32. x = (c - b * y) / a;
  33. if (y < 0 || x < 0) { printf("-1 -1\n0\n"); goto END; }
  34. ans1 = x + y;// (b < a时)最多的加油数量, 否则是最少的加油数量
  35. x2 = x % b; y2 = (c - a * x2) / b;
  36. ans2 = x2 + y2;
  37. printf("%lld %lld\n", min(ans1, ans2), max(ans1, ans2));
  38. printf("%lld\n", abs(x2 - x) / b + 1);
  39.  
  40. END:
  41. #ifndef SUBMIT
  42. printf("\n----------\n");
  43. getchar(); getchar();
  44. #else
  45. fclose(stdin); fclose(stdout);
  46. #endif
  47.  
  48. return 0;
  49. }