20211012 - Virtual Judge (vjudge.net)
链接
这个题是隔位进位,可以把数按奇偶拆开
例如 2021 奇数位是22 偶数位是1
22可以由( 0 22 ,1 22 2 20 ,3 19 ..... ,22 0 )一共是23种
同理 偶数位是 2种 所有的可能就是23*2=46
但是注意这个题目要求 a和b是不为0的 所以减去两种情况 就是44种
再例如 10000 奇数位是100 偶数位是0 所有可能就是101*1=101 再减去2答案为99
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int q[1000010];
int main(){
int x;//测试组数
cin>>x;
while(x--){
int n;
cin>>n;
int a=0,b=0; //分别来存储 偶数位和奇数位
int t=n;
int cnt=1;
while(t){ //将n的每一位数输入到数组里
q[cnt]=t%10;
t/=10;
cnt++;
}
for(int i=cnt;i>0;i-=2){
a*=10;
a+=q[i];
}
for(int i=cnt-1;i>0;i-=2){
b*=10;
b+=q[i];
}
int res=(a+1)*(b+1)-2; //套用刚才的公式
cout<<res<<endl;
}
}
这个法子也不是我想到的 之前cf做题碰到就记住了。