結果

問題 No.2104 Multiply-Add
ユーザー matsup10matsup10
提出日時 2022-10-21 23:33:11
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,935 bytes
コンパイル時間 3,060 ms
コンパイル使用メモリ 264,572 KB
実行使用メモリ 814,884 KB
最終ジャッジ日時 2023-09-13 23:40:48
合計ジャッジ時間 6,098 ms
ジャッジサーバーID
(参考情報)
judge14 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 MLE -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/extc++.h>
using namespace std;
using ll = long long;
#define REP(i,n) for(int i=0;i<int(n);i++)
#define FOR(i,a,b) for(int i=a;i<=int(b);i++)
#define ALL(x) x.begin(),x.end()
#define INFL LLONG_MAX


signed main() {
  ll a, b, c, d;
  cin >> a >> b >> c >> d;

  if(gcd(a, b) != gcd(c, d)) {
    cout << -1;
    return 0;
  }

  if(a==c && b==d) {
    cout << 0;
    return 0;
  }

  vector<pair<int,ll>> ans1;

  ll ta = a, tb = b;

  if(ta==0) {
    ans1.push_back({1, 1});
    ta += tb;
  }

  if(tb==0) {
    ans1.push_back({2, 1});
    tb += ta;
  }

  if(tb < 0) {
    ans1.push_back({2, -(abs(tb) / abs(ta) + 1)});
    tb += -(abs(tb) / abs(ta) + 1) * ta;
  }

  if(ta < 0) { 
    ans1.push_back({1, (abs(ta) / abs(tb) + 1)});
    ta += (abs(ta) / abs(tb) + 1) * tb;
  }

  while(ta != 0) {
    if(tb > ta) {
      ans1.push_back({2, -((tb - 1) / ta)});
      tb %= ta;
      if(tb == 0) tb = ta;
    } else if (tb < ta) {
      ans1.push_back({1, -(ta / tb)});
      ta %= tb;
    } else {
      ans1.push_back({2, -1});
      break;
    }
  }


  vector<pair<int,ll>> ans2;
  ll tc = c, td = d;

  if(tc==0) {
    ans2.push_back({1, 1});
    tc += td;
  }

  if(td==0) {
    ans2.push_back({2, 1});
    td += tc;
  }

  if(td < 0) {
    ans2.push_back({2, -(abs(td) / abs(tc) + 1)});
    td += -(abs(td) / abs(tc) + 1) * tc;
  }

  if(tc < 0) { 
    ans2.push_back({1, (abs(tc) / abs(td) + 1)});
    tc += (abs(tc) / abs(td) + 1) * td;
  }

  
  while(tc != 0) {
    if(td > tc) {
      ans2.push_back({2, ((td-1) / tc)});
      td %= tc;
      if(td == 0) td = tc;
    } else if (td < tc) {
      ans2.push_back({1, (tc / td)});
      tc %= td;
    } else {
      ans2.push_back({2, 1});
      break;
    }
  }

  reverse(ALL(ans2));

  REP(i, ans1.size()) cout << ans1[i].first << ' ' << ans1[i].second << endl;
  REP(i, ans2.size()) cout << ans2[i].first << ' ' << ans2[i].second << endl;
  

  return 0;
}
0