Carrying Conundrum(思维)

题目

Carrying Conundrum


问题描述

定义一种特殊加法计算:
在这里插入图片描述
上式为正常加法计算,下式为特殊加法计算,特殊之处在于进位将会跳跃一位相加, 比如应该进位到十位的1进位到了百位,应该进位到百位的1进位到了千位。
给定测试总数 t t t,每个测试包含一个数 n n n n n n是由特殊加法计算所得出的结果,问有多少对 ( a , b ) (a,b) (a,b)可使得 a   +   b = n a\ +\ b=n a + b=n,注意 ( a , b ) 与 ( b , a ) (a,b)与(b,a) (a,b)(b,a) a ≠ b a\neq b a=b时视作不同,当 a = b a=b a=b时视作相同。
要求 a , b a,b a,b均为正整数。

例:当 n = 12 n=12 n=12时,有4种情况,分别为:
1.a=11,b=1;
2.a=1,b=11;
3.a=10,b=2;
4.a=2,b=10;


分析

特殊计算的特点是进位都只会隔位相加,也就是说只有相隔的列之间才会有影响,若两个列相邻,则不会有影响。
不妨将相隔的列都取出来,组成一个新的数,以2021作为样例,可从中分出两个数分别是1和22,
满足 a + b = 1 a+b=1 a+b=1 ( a , b ) (a,b) (a,b)对有 ( 0 , 1 ) , ( 1 , 0 ) (0,1),(1,0) (0,1),(1,0),共2对;
满足 a + b = 22 a+b=22 a+b=22 ( a , b ) (a,b) (a,b)对有 ( 0 , 22 ) , ( 1 , 21 ) … … , (0,22),(1,21)……, (0,22),(1,21)共有23对。

两两匹配就可以得到满足条件的 a , b a,b a,b,比如 ( 0 , 1 ) 与 ( 2 , 20 ) (0,1)与(2,20) (0,1)(2,20)
可以得到 a = 0020 , b = 2001 a=0020,b=2001 a=0020,b=2001,结果为2021.
以此类推。

不过存在两个特例:
1. ( 0 , 1 ) 与 ( 0 , 22 ) (0,1)与(0,22) (0,1)(0,22)
对应 a = 0000 , b = 2021 a=0000,b=2021 a=0000,b=2021
2. ( 1 , 0 ) 与 ( 22 , 0 ) (1,0)与(22,0) (1,0)(22,0)
对应 a = 2021 , b = 0000 a=2021,b=0000 a=2021,b=0000
对于题目来说,不考虑这种存在0的情况。

所以最终的结果为 2 ∗ 23 − 2 = 44 2*23-2=44 2232=44


代码

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
int t;
string S;
int main(){
	while(cin>>t){
		while(t--){
			cin>>S;
			ll c=0,d=0;
			for(int i=0;i<S.size();i++){
				if(i%2){
					c*=10;
					c+=S[i]-'0';
				}
				else{
					d*=10;
					d+=S[i]-'0';
				}
			}
			cout<<(c+1)*(d+1)-2<<endl;
		}
	}
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值