提交时间:2024-11-07 20:39:59
运行 ID: 34439
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcount using namespace std; typedef long long ll; const int maxn=1e6+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }ll n;int k; ll s[20],ss[20]; ll a[20],b[20]; int get_len(ll x){ int res=0; while(x)res++,x/=10; return res; } ll qp(ll a,int b){ ll res=1; while(b--)res=res*a; return res; } ll g1[maxn],g2[maxn]; ll cal(int l1,int o1,int l2,int o2){ if(((!l1)&&(!o1))||((!l2)&&(!o2))) return 0; down(i,k,max(l1*2+o1,l2*2+o2)+1)if(s[i])return 0; if(l1==l2&&o1==o2){ //printf("! %d %d\n",l1,o1); up(i,1,l1+o1)if(s[i]!=s[l1*2+o1+1-i])return 0; //up(i,1,k)printf("%lld ",s[i]);printf("\n"); ll res=g2[s[1]]; up(i,2,l1+o1)res=res*g1[s[i]]; return res; } //cout<<l1<<" "<<o1<<" "<<l2<<" "<<o2<<endl; if(l1*2+o1<l2*2+o2)return 0; up(i,0,k)a[i]=b[i]=0; down(i,l1*2+o1,1){ if(i>l2*2+o2)a[i]=s[i]; //if(l1==1&&o1==1&&l2==1&&o2==0)cout<<"! "<<i<<" "<<a[i]<<endl; int p=l1*2+o1-i+1; //cout<<"p : "<<p<<endl; if(p<i)a[p]=a[i],b[p]=s[p]-a[i]; if(p>l2*2+o2)continue; int q=l2*2+o2-p+1; b[q]=b[p],a[q]=s[q]-b[q]; } //cout<<"! "<<l1<<" "<<o1<<" "<<l2<<" "<<o2<<endl; //if(l1==1&&o1==1&&l2==1&&o2==0){ //cout<<"!"<<endl; //up(i,1,k)printf("%lld ",a[i]);printf("\n"); //up(i,1,k)printf("%lld ",b[i]);printf("\n"); //up(i,1,k)printf("%lld ",s[i]);printf("\n"); //} up(i,1,k)if(a[i]+b[i]!=s[i]||a[i]<0||a[i]>9||b[i]<0||b[i]>9)return 0; up(i,1,l1+o1)if(a[i]!=a[l1*2+o1+1-i])return 0; up(i,1,l2+o2)if(b[i]!=b[l2*2+o2+1-i])return 0; if(!a[l1*2+o1])return 0; if(!b[l2*2+o2])return 0; //up(i,1,k)printf("%lld ",a[i]);printf("\n"); //up(i,1,k)printf("%lld ",b[i]);printf("\n"); return 2; } void slv(){ up(i,0,9)up(j,0,9)g1[i+j]++; up(i,1,9)up(j,1,9)g2[i+j]++; n=read();k=get_len(n); ll tmp=n;up(i,1,k)ss[i]=tmp%10,tmp/=10; //up(i,1,k)printf("%lld ",ss[i]);printf("\n"); ll res=0; for(int i=0;i<(1<<(k-1));++i){ memcpy(s,ss,sizeof(ss)); up(j,1,k){ if((i>>(j-1))&1)s[j]+=10,s[j+1]--; } bool ok=1; up(j,1,k)if(s[j]<0||s[j]>18)ok=0; if(!ok)continue; up(l1,0,k/2){ up(o1,0,1){ int lim=0; if(l1*2+o1+1<k)lim=(k-1)/2; up(l2,lim,k/2){ up(o2,0,1){ if(max(l1*2+o1,l2*2+o2)+1<k)continue; res+=cal(l1,o1,l2,o2); } } } } }cout<<res; } int main(){ //freopen("palindrome.in","r",stdin); //freopen("palindrome.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }