提交时间:2024-11-08 09:21:54
运行 ID: 34447
#include<bits/stdc++.h> using namespace std; #define int long long int n,cnt,ans,a[30],jw[30],sum[30],b[30],c[30]; void slv(){ for(int i=1;i<=cnt;i++)sum[i]=a[i]; int ct=cnt; for(int i=1;i<=cnt;i++){//每一位的真实和 if(jw[i]==1){sum[i]+=10;sum[i+1]--;if(sum[i]>18)return;} } if(sum[cnt]==0)ct--; // cout<<"!!!"<<endl; // for(int i=1;i<=ct;i++){cout<<sum[i]<<" ";} // cout<<endl; //如果两个数位数相同 bool flag=0; for(int i=1;i*2<=ct;i++){ if(sum[i]!=sum[ct-i+1])flag=1; } if(!flag){ int res=min(9ll,sum[1]-1)-max(1ll,sum[1]-9)+1; for(int i=2;i<=(ct+1)/2;i++){ res*=min(9ll,sum[i])-max(0ll,sum[i]-9)+1; } ans+=res; } //如果两个数位数不同 for(int i=1;i<=ct;i++)b[i]=c[i]=0; for(int i=1;i<=ct-1;i++){//枚举较短数的位数 bool d=0; for(int j=1;j<=(ct+1)/2;j++){ b[j]=b[ct-j+1]=sum[ct-j+1]-c[ct-j+1]; if(b[j]<0||b[j]>9||(j==1&&b[j]==0)){d=1;break;} if(i>=j){ c[i-j+1]=c[j]=sum[j]-b[j]; if(c[j]<0||c[j]>9||(j==1&&c[j]==0)){d=1;break;} } } if(!d){ // for(int i=1;i<=ct;i++)cout<<b[i]<<" "; // cout<<endl; ans++; } } } void dfs(int i){//枚举每一位是否进位 if(i>=cnt){slv();return;} jw[i]=0;dfs(i+1); jw[i]=1;dfs(i+1); } signed main(){ // freopen("P5863.in","r",stdin); cin>>n; int nn=n; while(nn>0){a[++cnt]=nn%10;nn/=10;} dfs(1); cout<<ans<<endl; return 0; }