Submission #35944649


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)
#define per(i,a,n) for (ll i=n;i-->(ll)a;)
ll read(){ll r;scanf("%lld",&r);return r;}
using Arrow=pair<ll,ll>;

namespace MatrixVec{
  // 行列式 高斯消元 解增广矩阵, 答案全为整数
  // {是否成功, 消元后的增广矩阵(左边nxn 为单位矩阵)}
  pair<bool,vector<vector<ll>>> solvell(const vector<vector<ll>>& _a){
    auto a=_a;
    auto n=a.size(); // 行
    if(n==0) return {true,{}};
    assert(n < a[0].size()); // 增广
    rep(j,0,n){
      rep(i,j,n)if(a[i][j]!=0){ // >=j行中找j列首个非零值,做行交换
        if(i!=j) std::swap(a[i],a[j]);
        break;
      }
      if(a[j][j]==0) return {false,{}};
      per(k,j,a[j].size()){ // 保证答案全为整数, 注意顺序
        if(a[j][k] % a[j][j] !=0) return {false,{}};
        a[j][k]/=a[j][j];
      }
      rep(i,0,n) if(i!=j)per(k,j,a[i].size())a[i][k]-=a[i][j]*a[j][k]; // 行变换, 注意per顺序
    }
    return {true,a};
  }
};

vector<Arrow> XY={
  {1,0},
  {1,1},
  {0,1},
  {-1,1},
  {-1,0},
  {-1,-1},
  {0,-1},
  {1,-1},
};

const ll INF=0x3f3f3f3f3f3f3f3f;

char s[10];

ll solve1(Arrow xy,Arrow ab){
  auto [x,y] = xy;
  auto [a,b] = ab;
  if(x*b!=a*y) return INF; // a/x == b/y
  ll res = (x==0?b/y:a/x);
  return res>=0?res:INF;
}

ll solve2(vector<vector<ll>> mat){
  auto [ok,res] = MatrixVec::solvell(mat);
  if(!ok) return INF; // 无整数解
  ll a = res[0][2];
  ll b = res[1][2];
  return (a>=0 && b>=0)?a+b:INF;
}

void w(){
  ll a= read();
  ll b= read();
  scanf("%s",s);
  if(!a && !b) {
    printf("0\n");
    return ;
  }
  vector<Arrow>op;
  rep(i,0,8) if(s[i]=='1') op.push_back(XY[i]);
  ll ans = INF;
  for(auto o:op) ans = min(ans,solve1(o,{a,b}));
  rep(i,0,op.size()) rep(j,i+1,op.size()){
    auto [x0,y0] = op[i];
    auto [x1,y1] = op[j];
    if(x0+x1==0 && y0+y1==0) continue; // 不会取逆向
    ans = min(ans, solve2({
          {x0,x1,a},
          {y0,y1,b},
          }));
  }
  rep(k,0,op.size()){
    auto [x,y] = op[k];
    if(abs(x)+abs(y) != 1) continue; // 使用一次的轴向边
    rep(i,0,op.size()) rep(j,i+1,op.size()){
      auto [x0,y0] = op[i];
      auto [x1,y1] = op[j];
      if(x0+x1==0 && y0+y1==0) continue; // 不会取逆向
      ans = min(ans, 1+solve2({
            {x0,x1,a-x},
            {y0,y1,b-y},
            }));
    }
  }
  printf("%lld\n",ans==INF?-1:ans);
}

int main(){
  int t=read();
  while(t--)w();
  return 0;
}

Submission Info

Submission Time
Task Ex - General General
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 2528 Byte
Status AC
Exec Time 309 ms
Memory 3724 KiB

Compile Error

./Main.cpp: In function ‘ll read()’:
./Main.cpp:7:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    7 | ll read(){ll r;scanf("%lld",&r);return r;}
      |                ~~~~~^~~~~~~~~~~
./Main.cpp: In function ‘void w()’:
./Main.cpp:68:8: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   68 |   scanf("%s",s);
      |   ~~~~~^~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 1
AC × 18
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 02_rnd_00.txt, 02_rnd_01.txt, 02_rnd_02.txt, 02_rnd_03.txt, 03_zero_00.txt, 04_one_00.txt, 04_one_01.txt, 05_two_00.txt, 05_two_01.txt, 06_max_00.txt, 06_max_01.txt, 07_255_00.txt, 07_255_01.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 7 ms 3700 KiB
01_small_00.txt AC 67 ms 3568 KiB
01_small_01.txt AC 67 ms 3664 KiB
01_small_02.txt AC 70 ms 3624 KiB
01_small_03.txt AC 13 ms 3632 KiB
02_rnd_00.txt AC 71 ms 3720 KiB
02_rnd_01.txt AC 70 ms 3632 KiB
02_rnd_02.txt AC 76 ms 3572 KiB
02_rnd_03.txt AC 70 ms 3724 KiB
03_zero_00.txt AC 6 ms 3572 KiB
04_one_00.txt AC 75 ms 3720 KiB
04_one_01.txt AC 69 ms 3568 KiB
05_two_00.txt AC 70 ms 3636 KiB
05_two_01.txt AC 74 ms 3660 KiB
06_max_00.txt AC 70 ms 3636 KiB
06_max_01.txt AC 70 ms 3564 KiB
07_255_00.txt AC 309 ms 3696 KiB
07_255_01.txt AC 309 ms 3668 KiB