This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <memory.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
typedef double lf;
typedef long double llf;
const int N_ = 500;
int TC, TCC;
char A[N_], B[N_], C[N_];
int AN, BN, CN;
char op;
inline int calc (int a, int b) {
return (op == '+') ? (a+b) : (a-b);
}
struct F {
string a, b, c;
F(string a = "", string b = "", string c = ""): a(a), b(b), c(c) { }
bool operator< (const F &s) const {
if(a != s.a) return a < s.a;
if(b != s.b) return b < s.b;
return c < s.c;
}
};
F Table[N_][2];
char state[N_][2];
int T;
F solve (int x, bool carry) {
char a, b, c;
if(AN-x < 1 && BN-x < 1 && CN-x < 1) { state[x][carry] = carry ? -1 : 1; return F(); }
if(state[x][carry]) return Table[x][carry];
// printf("%d %d / %d %d %d\n", x, carry, AN-x, BN-x, CN-x);
F &ret = Table[x][carry];
bool chk = false;
//printf("%c %c %c\n", A[AN-x], B[BN-x], C[CN-x]);
for(a = 0; a <= 9; a++) if(AN-x < 0 || A[AN-x] == '?' || A[AN-x] == a+'0') {
if(AN-x < 0 && a != 0) continue;
if(a == 0 && AN-x == 1 && AN > 1) continue;
for(b = 0; b <= 9; b++) if(BN-x < 0 || B[BN-x] == '?' || B[BN-x] == b+'0') {
if(BN-x < 0 && b != 0) continue;
if(b == 0 && BN-x == 1 && BN > 1) continue;
c = calc(a, b) + calc(0, carry); if(CN-x < 0 || C[CN-x] == '?' || C[CN-x] == (c+10)%10+'0') {
if(CN-x < 0 && (c+10)%10 != 0) continue;
if((c+10)%10 == 0 && CN-x == 1 && CN > 1) continue;
//printf("%d %d - %d(%c) %d(%c) %d(%c)\n", x, carry, a, A[AN-x], b, B[BN-x], c, C[CN-x]);
F tmp = solve(x+1, (c<0 || c>9));
if(state[x+1][c<0 || c>9] == -1) continue;
if(AN-x > 0) tmp.a += (char)(a + '0');
if(BN-x > 0) tmp.b += (char)(b + '0');
if(CN-x > 0) tmp.c += (char)((c+10)%10 + '0');
if(!chk || tmp < ret) ret = tmp, chk = true;
}
}
}
state[x][carry] = 1;
if(ret.a.empty() && ret.b.empty() && ret.c.empty()) state[x][carry] = -1;
//printf("%d %d : %s %c %s = %s : %d\n", x, carry, ret.a.c_str(), op, ret.b.c_str(), ret.c.c_str(), state[x][carry]);
return ret;
}
int main() {
int i, j;
scanf("%d\n", &TC);
while(++TCC <= TC) {
scanf("%s %c %s = %s\n", A+1, &op, B+1, C+1);
for(i = 0; i < N_; i++) Table[i][0] = Table[i][1] = F(), state[i][0] = state[i][1] = 0;
AN = strlen(A+1); A[0] = '0'; //for(i=1; i<=AN; i++) A[i] -= '0';
BN = strlen(B+1); B[0] = '0'; //for(i=1; i<=BN; i++) B[i] -= '0';
CN = strlen(C+1); C[0] = '0'; //for(i=1; i<=CN; i++) C[i] -= '0';
//printf("%d %d %d\n", AN, BN, CN);
F res = solve(0, false);
printf("Case #%d: %s %c %s = %s\n", TCC, res.a.c_str(), op, res.b.c_str(), res.c.c_str());
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |