Codeforces Round #742C Non-Decreasing Dilemma(思维题)

题目大意:
正常的加法进位:1+9=10,99+1=100
alice的加法进位1+9=100,99+1=190
正常进位会把进位的数加在前面一位,alice会把数加在前面两位
现在给一个数n,要求你找到有多少不同的数对以alice的加法相加时,结果为n
可以注意到,正常的加法是将奇数位进位到偶数,偶数位进位到奇数位
但alice的加法是奇数位进位到奇数位,偶数位进位到偶数位
也就是说,偶数位与奇数位是互不影响的
所以可以把一个数按奇偶数位进行拆分,分别计算拆分出的两个数有多少个组合方式,一个k的组合方式有(0,k)(1,k-1)(2,k-2)……(k,0)
一共有k种组合方式
但同时也有不合法的情况,就是这两个数字对应总和中的第一个和第二个数字是0
例如(0,1)与(0,22) \ (1,0)与(22,0)
对应过来a=0000,b=2021\a=2021,b=0
由于题目要求a,b要大于0,所以不合法
要减去两个特殊情况
公式就是(x+1)*(y+1)-2

#include <bits/stdc++.h>
#define int long long
using namespace std;
int f[110];
 
int si(string s) {
    
    
	int l = s.size();
	int res = 0;
	for (int i = 0; i < l ; i++) {
    
    
		res += (int)s[i] - '0';
		if (i == l - 1)
			break;
		res *= 10;
	}
	return res;
}
 
void solve() {
    
    
	string s;
	cin >> s;
	int l = s.size();
	string s1, s2;
	for (int i = 0; i < l; i++) {
    
    
		if (i % 2 == 1) {
    
    
			s1 += s[i];
		} else {
    
    
			s2 += s[i];
		}
	}
	int a = si(s1);
	int b = si(s2);
	cout << (a + 1)*(b + 1) - 2 << endl;
}
 
signed main() {
    
    
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
 
	int t;
	cin >> t;
	while (t--) {
    
    
		solve();
	}
}

おすすめ

転載: blog.csdn.net/fdxgcw/article/details/120167496