Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34469 22级廖思学 【S】T3 C++ 通过 100 37 MS 260 KB 2287 2024-11-08 11:54:57

Tests(10/10):


#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){ // cout<<"???"<<" "; 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; // cout<<res<<endl; } //如果两个数位数不同 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;j++)c[j]=-1; for(int j=1;j<=(ct+1)/2;j++){ // cout<<i<<" "<<j<<" "<<b[j]<<" "<<sum[ct-j+1]<<" "<<c[ct-j+1]<<endl; if(c[ct-j+1]<0)c[ct-j+1]=0; if(c[j]>=0&&sum[j]-c[j]!=sum[ct-j+1]-c[ct-j+1]){d=1;break;} 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){ // cout<<i<<" "<<j<<" "<<sum[j]<<" "<<b[j]<<endl; 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;} } else{ if(b[j]!=sum[j]){d=1;break;} } } if(!d){ // cout<<"???"<<endl; // for(int i=1;i<=ct;i++){cout<<sum[i]<<" ";} // cout<<endl; // for(int j=1;j<=ct;j++)cout<<b[j]<<" "; // cout<<endl; // for(int j=1;j<=i;j++)cout<<c[j]<<" "; // cout<<endl; ans+=2; } } } void dfs(int i){//枚举每一位是否进位 if(i>=cnt){slv();return;} jw[i]=0;dfs(i+1); jw[i]=1;dfs(i+1); } signed main(){ cin>>n; int nn=n; while(nn>0){a[++cnt]=nn%10;nn/=10;} dfs(1); cout<<ans<<endl; return 0; }


测评信息: