这题很shui(水),只需要预处理出数字1-9的幂次方,然后遇到一个数,就将它拆分成数字,从1次方试下去。如果找不到可行解,则这个数就不好。反之,如果找到了解,就是好的,ans的值加上1。
本人代码如下:
#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
int n,x,len,s,ans=0;
LL p[11][21];
char a[8];
void cl(){
for(int i=0;i<=10;++i) p[i][0]=1;
for(int i=1;i<=20;++i){
for(int j=0;j<10;++j){
p[j][i]=p[j][i-1]j;
}
}
for(int i=1;i<11;++i) p[10][i]=p[10][i-1]*10;
}
void st(){
len=strlen(a);x=0;
for(int i=0;i<len;++i){
x+=p[10][len-i-1]
(a[i]-48);
}
for(int i=0;i<21;++i){
s=0;
for(int j=0;j<len;++j) s+=p[a[j]-48][i];
if(s==x){
++ans;return;
}
}
}
int main(){
cl();
cin>>n;
while(n--){
cin>>a;
st();
}
cout<<ans<<endl;
return 0;
}</cstring></iostream>