CF1575D Divisible by Twenty-Five
CF1575D Divisible by Twenty-Five
打表后注意到能被 \(25\) 整除的数最后两位都是 \(00,25,50,75\),其余位数按要求随便填即可,所以可以 \(O(|S|)\) 暴力做,注意 \(n = 1, n = 2\) 和最高位是 \(X\) 的细节即可。
一开始没有想到可以一位一位统计(判断一下最后两位能不能成立就行),结果写成了200行的大模拟。积累代码经验吧。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
char s[10];
//int a[10];
char a[4] = {'0', '2', '5', '7'}, b[4] = {'0', '5', '0', '5'};
void Main(){
cin >> s;
int n = strlen(s), ans = 0;
if(n == 1){
if(s[0] > '0' && s[0] <= '9'){
cout << 0 << '\n';
}
else{
cout << 1 << '\n';
}
return ;
}
if(s[0] == '0'){
cout << 0 << '\n';
return ;
}
char a1 = s[n - 2], a2 = s[n - 1];
// printf("X = %d\n", X);
if(isdigit(a1) && a1 != '0' && a1 != '2' && a1 != '5' && a1 != '7'){
cout << 0 << '\n';
return ;
}
if(isdigit(a2) && a2 != '0' && a2 != '5'){
cout << 0 << '\n';
return ;
}
if(n == 2){
ans = 0;
if(a1 == 'X' && a2 == 'X'){
cout << 0 << '\n';
return ;
}
F(i, 0, 3){
if(isdigit(a1) && a1 != a[i]) continue;
if(isdigit(a2) && a2 != b[i]) continue;
if(a[i] != '0') ++ ans;
}
}
else{
F(i, 0, 3){
int x = -1, sm = 1;
if(isdigit(a1) && a1 != a[i]) continue;
if(isdigit(a2) && a2 != b[i]) continue;
if(a1 == 'X' && a2 == 'X'){
if(i == 0){
x = 0;
}
else{
continue;
}
}
if(a1 == 'X') x = a[i] - '0';
if(a2 == 'X') x = b[i] - '0';
if(s[0] == 'X'){
if(x == -1){
sm *= 9;
x = 1;
}
else if(x == 0) continue;
}
else if(s[0] == '_'){
sm *= 9;
}
F(j, 1, n - 3){
if(s[j] == 'X'){
if(x == -1){
x = 1;
sm *= 10;
}
else{
sm *= 1;
}
}
else if(s[j] == '_'){
sm *= 10;
}
}
ans += sm;
}
}
cout << ans << '\n';
return ;
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T = 1;
while(T --) Main();
return fflush(0), 0;
}

浙公网安备 33010602011771号