当前位置: 代码迷 >> 综合 >> Carrying Conundrum(思维)
  详细解决方案

Carrying Conundrum(思维)

热度:60   发布时间:2023-11-23 22:01:29.0

题目

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 2?23?2=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;
}