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;
}
posted @ 2026-10-03 15:29  superl61  阅读(3)  评论(0)    收藏  举报