提交时间:2024-11-07 20:16:19

运行 ID: 34437

#include<bits/stdc++.h> using namespace std; #define int long long int n,m; inline int gen(int x){ int k=0; while(x)k=k*10+x%10,x/=10; return k; } int pw[111]; inline bool chk(int x){ if(x<=0)return 0; return gen(x)==x; } inline int ct(int x){ int c=0; while(x)x/=10,c++; return c; } inline pair<int,int> F(int x){ int y=gen(x); int c=ct(x); return {x*pw[c]+y,x/10*pw[c]+y}; } inline int force(int n){ int res=0; for(int i=1;i<1e7;i++){ pair<int,int>A=F(i); if(n-A.first>A.first){ if(chk(n-A.first)) res++; } if(n-A.second>A.second){ if(chk(n-A.second)) res++; } } res*=2; if(n%2==0&&n/2<1e14)res+=chk(n/2); return res; } int f[2][2][2][10][10000]; #define double long double inline double calc(double p){ return p*powl(10,p)+powl(10,21-2*p)*8*(18-p); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("palindrome.in","r",stdin); // freopen("palindrome.out","w",stdout); // for(int i=1;i<=18;i++) // cout<<i<<" "<<calc(i)<<endl; // return 0; cin>>n; pw[0]=1; for(int i=1;i<=10;i++) pw[i]=pw[i-1]*10; if(n<=1e14) cout<<force(n)<<endl; else{ pw[0]=1; pw[1]=10; pw[2]=100; pw[3]=1000; pw[4]=10000; int res=force(n); string s=to_string(n); reverse(s.begin(),s.end()); bool ex=0; if(s.size()==19)s.pop_back(),ex=1; for(char &x:s)x-='0'; for(int a=s.size()-2;a<=s.size()-1;a++) for(int b=14;b<=a;b++){ memset(f,0,sizeof(f)); if(a==s.size()-2&&(ex||s.back()!=1))continue; bool fl=0; if(a==s.size()-2)fl=1; f[fl][ex][0][0][0]=1; for(int i=0;i<s.size();i++){ fl^=1; memset(f[fl],0,sizeof(f[fl])); if(fl){ int id=i/2; for(int p=0;p<=1;p++) for(int q=0;q<=1;q++) for(int aq=0;aq<=1;aq++) for(int l=0;l<=9;l++) for(int S=0;S<=9999;S++)if(f[!fl][p][q][l][S]){ int x=s[id]+10*aq-q; if(x<0)continue; for(int j=0;j<=9;j++){ int k=x-j; if(k<0||k>9)continue; int T=S/10+1000*k; f[fl][p][aq][j][T]+=f[!fl][p][q][l][S]; } } } else{ int id=s.size()-i/2-1; for(int p=0;p<=1;p++) for(int q=0;q<=1;q++) for(int ap=0;ap<=1;ap++) for(int l=0;l<=9;l++) for(int S=0;S<=9999;S++)if(f[!fl][p][q][l][S]){ int x=s[id]+10*p-ap; if(x<0)continue; int j=l; int k=x-j; if(k<0)continue; if(id>a&&j)continue; if(id==a&&!j)continue; if(id<=a&&j!=l)continue; if(id>b&&k)continue; if(id==b&&!k)continue; if(id<=b&&k!=S/pw[3-(a-b)]%10)continue; f[fl][ap][q][l][S]+=f[!fl][p][q][l][S]; } } } int ct=0; for(int p=0;p<=1;p++) for(int l=0;l<=9;l++) for(int S=0;S<=9999;S++)if(f[fl][p][p][l][S]){ if(fl){ if(S/pw[3-(a-b)]==0||chk(S/pw[3-(a-b)])) ct+=f[fl][p][p][l][S]; } else{ if(S/pw[4-(a-b)]==0||chk(S/pw[4-(a-b)])) ct+=f[fl][p][p][l][S]; } } if(a==b)res+=ct; else res+=2*ct; } cout<<res<<endl; } cout.flush(); return 0; }