1. 程式人生 > 其它 >Codeforces Round #742 (Div. 2) Problem - C. Carrying Conundrum 題解

Codeforces Round #742 (Div. 2) Problem - C. Carrying Conundrum 題解

Codeforces Round #742 (Div. 2) Problem - C. Carrying Conundrum 題解

題目

原題連線

Codeforces Round #742 (Div. 2) Problem - C. Carrying Conundrum

題目大意


題目大概意思為給你一個數\(n\),這個\(n\)是按照Alice的那種加法方法算\(a + b\)算出來的。
\((a,b)\)有幾種。
Alice的加法方法為,加法進位時候,進到下下一位。具體操作看圖片咯。

題解

思路

Alice的加法,其實可以看做,奇數位加奇數位的,偶數位加偶數位的。
假設\(n=12345\),把它奇偶數位拆分開得到\(a=135, b=24\)\(a\)可以拆分成\(135 = 45 + 90\)\(b\)可以拆分成\(24 = 9 + 15\)

。然後再將\(45,9\),\(90,15\)組合起來,就能得到一組數\((495, 1950)\)
運用Alice的加法,\(495 + 1950 = 12345\)。 這就是其中一個解。
總共有多少種解?這取決於\(a,b\)可以拆分成多少種。
一個正數\(x\)可以拆分成\(x+1\)種:\(0+x, 1+(x-1), 2+(x-2), ..., x+0\)
所以總共的解應該為\((a+1)*(b+1)\)。題目中要求拆分出來的數字,必須為正數,也就是\(n=12345\)時,\((0, 12345)\)\((12345, 0)\)是不符合的。所以要減去\(2\)
最終結果為\((a+1)*(b+1)-2\)

程式碼

then show the code.

#include <iostream>
#include <string>

using namespace std;

int main(){
    int t;
    cin >> t;
    while(t--){
        string s, s1, s2;
        cin >> s;
        for(int i=0; i<s.size(); i++){
            if(i&1) s2 += s[i];
            else s1 += s[i];
        }
        if(s2.empty()) cout << stoi(s1) - 1 << endl;
        else cout << (stoi(s1)+1) * (stoi(s2)+1) - 2 << endl;
        
    }
    return 0;
}
不忘初心方得始終