【题解】CF1567C Carrying Conundrum

官方题解的做法根本想不到,讲一下官方题解的做法。

Sol

首先可以发现一个性质,奇数位的数只会进位到奇数位。
偶数位同理。
我们考虑把奇数位的数和偶数位的数单独考虑。
显然,对于一个数 \(n\),分为 \(2\) 个非负整数之和只有 \(n+1\) 种方案。
记奇数位上的数为 \(x\),偶数位上的数为 \(y\)
那么最终的答案即为 \((x+1) \times (y+1)-2\)
由于不能取 \(0\) 所以最终的答案还要减去 \(2\)

Code

signed main()
{
	T=read();
	while (T--)
	{
		scanf("%s",st+1); n=strlen(st+1);
		num1=num2=0;
		for (int i=1;i<=n;i+=2)
			num1=num1*10+(st[i]^48);
		for (int i=2;i<=n;i+=2)
			num2=num2*10+(st[i]^48);
		writeln((num1+1)*(num2+1)-2);
	}
}
posted @ 2021-09-06 11:15  dd_d  阅读(172)  评论(0)    收藏  举报