codeforces 1575 D. Divisible by Twenty-Five
题意:给一个串,由数字和’_‘和’X’组成,每个’_'都可以任意取0-9,每个’X’上的字母相同,问有多少种可能能被25整除。
就嗯分类讨论
太差了wa爆不愿再笑
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
ll qpow(ll x, ll n) {
ll res = 1;
while (n) {
if (n & 1) res = res * x;
x = x * x;
n >>= 1;
}
return res;
}
ll solve(string s) {
if (s[0] == '0') return 0;
ll len = s.size();
ll cnt_ = 0, cntX = 0;
for (ll i = 1; i < len - 2; ++i) {
if (s[i] == '_') cnt_++;
if (s[i] == 'X') cntX++;
}
int tmp = 0;
if (s[len - 2] == '_') {
if (s[len - 1] == '_') tmp = qpow(10, cnt_) * 4;
else if (s[len - 1] == 'X') {
if (s[0] == 'X') return qpow(10, cnt_) * 2 * (s[0] == '_' ? 9 : 1);
else return qpow(10, cnt_) * 4 * (s[0] == '_' ? 9 : 1);
} else if (s[len - 1] == '0' || s[len - 1] == '5') tmp = qpow(10, cnt_) * 2;
else tmp = 0;
} else if (s[len - 2] == 'X') {
if (s[0] == 'X') {
if (s[len - 1] == 'X') return 0;
else if (s[len - 1] == '_') return qpow(10, cnt_) * 3 * (s[0] == '_' ? 9 : 1);
else if (s[len - 1] == '0') return qpow(10, cnt_) * (s[0] == '_' ? 9 : 1);
else if (s[len - 1] == '5') return qpow(10, cnt_) * 2 * (s[0] == '_' ? 9 : 1);
return 0;
} else {
if (s[len - 1] == '0' || s[len - 1] == '5') tmp = qpow(10, cnt_) * 2;
else if (s[len - 1] == '_') tmp = qpow(10, cnt_) * 4;
else if (s[len - 1] == 'X') tmp = qpow(10, cnt_);
else tmp = 0;
}
} else if (s[len - 2] == '0' || s[len - 2] == '2' || s[len - 2] == '5' || s[len - 2] == '7') {
if (s[len - 2] == '0' || s[len - 2] == '5') {
if (s[len - 1] == '0') tmp = qpow(10, cnt_);
else if (s[len - 1] == 'X') {
if (s[0] == 'X') return 0;
else {
tmp = qpow(10, cnt_);
}
}
else if(s[len - 1]=='_') {
tmp = qpow(10, cnt_);
}
} else {
if (s[len - 1] == '5') tmp = qpow(10, cnt_);
else if (s[len - 1] == 'X') {
if (s[0] == 'X') return qpow(10, cnt_) * (s[0] == '_' ? 9 : 1);
else {
tmp = qpow(10, cnt_);
}
}
}
} else tmp = 0;
if (s[len - 1] != 'X' && s[len - 2] != 'X' && cntX != 0 && s[0] != 'X') tmp = tmp * 10;
if (s[0] == '_' || s[0] == 'X') tmp = tmp * 9;
return tmp;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
string s;
cin >> s;
if (s.size() == 1) {
if (s[0] == '0' || s[0] == '_' || s[0] == 'X') cout << 1;
else cout << 0;
return 0;
}
if (s.size() == 2) {
if (s[0] == '0') cout << 0;
else if (s[0] == '_') {
if (s[1] == '_') cout << 3;
else if (s[1] == 'X') cout << 3;
else if (s[1] == '0') cout << 1;
else if (s[1] == '5') cout << 2;
else cout << 0;
} else if (s[0] == 'X') {
if (s[1] == '_') cout << 3;
else if (s[1] == 'X') cout << 0;
else if (s[1] == '0') cout << 1;
else if (s[1] == '5') cout << 2;
else cout << 0;
} else if (s[0] == '2' || s[0] == '7') {
if (s[1] == 'X' || s[1] == '_' || s[1] == '5') cout << 1;
else cout << 0;
} else if (s[0] == '5') {
if (s[1] == 'X' || s[1] == '_' || s[1] == '0') cout << 1;
else cout << 0;
} else cout << 0;
return 0;
}
ll res = solve(s);
cout << res;
return 0;
}