intさわだんのBlack History

刹那的レジェンドになりたい。

AOJ 1161 保留

#include <bits/stdc++.h>
#define chmin(a, b) ((a)=min((a), (b)))
#define chmax(a, b) ((a)=max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;
 
typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
 
const ll MOD=1e9+7;
const ll INF=1e18;
 
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};


char s[14][12],alp[12];
int n;
int alpsum; //アルファベットの出現数
bool notzero[12];
int tmp[12];
int multi[12]; //掛け算の重さ

bool check(int k){
    bool num[12];
    for(int i = 0;i < 11;i++) num[i] = false;
    for(int i = 0;i < alpsum;i++){
        tmp[i] = k % 10;
        if(num[tmp[i]] == true) return true;
        num[tmp[i]] = true;
        if(tmp[i] == 0 && notzero[i] == true) return true;
        k /= 10;
    }

    return false;
}


int main(){
    while(true){
        cin >> n;
        if(n == 0)break;
        alpsum = 0;
        for(int i = 0;i < 11;i++){
            notzero[i] = 0;
            multi[i] = 0;
        }
        for(int i = 0;i < n;i++){
            cin >> s[i];
            int slen = strlen(s[i]);
            for(int j = 0;j < slen;j++){
                bool flag = true;
                if(alpsum != 0){
                    for(int k = 0;k < alpsum;k++){
                        if(alp[k] == s[i][j]){
                            flag = false;
                            int c = 1;
                            for(int l = 0;l < slen-j-1;l++){
                                c *= 10;
                            }
                            if(i == n-1)c *= -1;
                            multi[k] += c;
                            break;
                        }
                    }
                }
                if(flag == true){
                    alp[alpsum] = s[i][j];
                    int c = 1;
                    for(int l = 0;l < slen-j-1;l++) c *= 10;
                    if(i == n-1)c *= -1;
                    multi[alpsum] += c;
                    if(j == 0 && strlen(s[i]) != 1) notzero[alpsum] = true;
                    alpsum++;
                }
            }
        }
        int size = 1;
        int ans = 0;
        for(int i = 0;i < alpsum;i++) size *= 10;
        for(int i = size;i < size*2;i++){
            if(check(i) == true)continue;
            int total = 0;
            for(int j = 0;j < alpsum;j++){
                total += tmp[j] * multi[j];
            }
            if(total == 0)ans++;
        }
        cout << ans << endl;
    }
}