C. Carrying Conundrum
原题链接
思维题
题目给出了一种百位进1的加法运算方式。把给出的数据分为偶数位和奇数位,进而转换成10进1的加法运算。例如 1234(n) ----->13(a)和24(b)。
a的组成可以为 0 + a,1 + ( a - 1) …a + 0共a + 1 种,b同理有b + 1 种。
则结果只要把0 + n,和n + 0这种情况删除就行;
ans = (a + 1) * (b + 1) - 2;
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1e6 + 10,mod = 1e9 + 10;
int T;
int a[N],b[N],idx;
int n,m;
int main(){
scanf("%d",&T);
while(T --)
{
scanf("%d",&n);
vector<int> A,B;
while(n){
A.push_back(n % 10);
n /= 10;
if(!n) break;
B.push_back(n % 10);
n /= 10;
}
int a = 0,b = 0;
for(int i = A.size() - 1;i >= 0;i --) a = a * 10 + A[i];
for(int i = B.size() - 1;i >= 0;i --) b = b * 10 + B[i];
cout<<(a + 1) * (b + 1) - 2<<endl;
}
return 0;
}
注:
Note that pairs (a,b) and (b,a) are considered different if a≠b.
有人可能会受到这句话的影响,会感觉上面的公式少减了几种情况;
其实举个例子就很好理解.
例:2222(n) -----> 22(a)+ 22(b);
在a中 有 11 + 11,但11 + 11 不会出现10 + 12,12 + 10这种互补的情况. b同理.
故不存在少减的数.