提交时间:2024-11-07 20:06:54

运行 ID: 34432

#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int N=30; int ans,n,m,a[N],p[N],f[2][N],bg[2]; queue<pii>q; bool sol(int x){ for(int i=1;i<=m;i++)f[0][i]=f[1][i]=-1; while(!q.empty())q.pop(); for(int i=1;i<=x;i++){q.push(mk(i,0)),f[0][i]=p[i];if(p[i]>9)return 0;} bg[0]=0,bg[1]=x; while(!q.empty()){ int op=q.front().sc,u=q.front().fr;q.pop(); if(f[op][m-u+bg[op]+1]==-1){ f[op][m-u+bg[op]+1]=f[op][u]; q.push(mk(m-u+bg[op]+1,op)); } else if(f[op][m-u+bg[op]+1]!=f[op][u])return 0; if(u>bg[op^1]){ if(f[op^1][u]==-1){ f[op^1][u]=p[u]-f[op][u]; if(f[op^1][u]<0||f[op^1][u]>9)return 0; q.push(mk(u,op^1)); } else if(f[op^1][u]!=p[u]-f[op][u])return 0; } } if(f[1][x+1]==0)return 0; return 1; } int check(){ int res=1; for(int i=1;i<=(m-1)/2+1;i++){ if(p[i]!=p[m-i+1])return 0; int l=max(i==1?1ll:0ll,p[i]-9),r=min(9ll,i==1?p[i]-1:p[i]); res*=r-l+1; } return res; } void dfs(int now){ if(now==m+1){ int tmp=0; if(!p[1]){tmp=1; for(int i=1;i<=m;i++)p[i]=p[i+1]; m--; } for(int i=1;i<=m;i++)ans+=i!=m?sol(i)*2:check(); if(tmp){ for(int i=m;i>=1;i--)p[i+1]=p[i]; p[1]=0; m++; } return; } p[now]=a[now]; dfs(now+1); if(now!=1)p[now]=a[now]+10,p[now-1]--,dfs(now+1),p[now-1]++,p[now]=0; } void slv(){ n=read(); int tmp=n; for(int i=1;i<=18;i++){ a[i]=tmp%10; tmp/=10; if(!tmp){m=i;break;} } reverse(a+1,a+m+1); dfs(1); printf("%lld",ans); } signed main(){ slv(); return 0; }