提交时间:2024-11-07 18:04:52
运行 ID: 34371
#include<bits/stdc++.h> #define int long long using namespace std; const int B=3e6+7; int Pow10[20]; int LG[B]; inline void Init(){ Pow10[0]=1; for(int i=1;i<=18;i++)Pow10[i]=Pow10[i-1]*10; LG[0]=0; for(int i=1;i<B;i++)LG[i]=LG[i/10]+1; } inline bool Palind(int x){ if(!x)return 0; vector<int> v; while(x){v.push_back(x%10);x/=10;} int cnt=v.size(); for(int i=0;i<cnt;i++)if(v[i]!=v[cnt-1-i])return 0; return 1; } inline int Rev(int x){ if(!x)return 0; vector<int> v; while(x){v.push_back(x%10);x/=10;} int cnt=v.size(); int ret=0; for(int i=0;i<cnt;i++)ret=(ret*10+v[i]); return ret; } int n; int Pal[B]; int cnt=0; inline void sub1(){ cnt=0; for(int i=1;i<=n;i++)if(Palind(i))Pal[++cnt]=i; int ret=0; for(int i=1;i<=cnt;i++){ for(int j=i+1;j<=cnt;j++)if(Pal[i]+Pal[j]==n)++ret; } ret<<=1; for(int i=1;i<=cnt;i++)if(Pal[i]+Pal[i]==n)ret++; cout<<ret<<endl; } int UB=1e12; inline void Gen(){ for(int i=1;i<=9;i++)Pal[++cnt]=i; for(int Pre=1;Pre<=999999;Pre++){ int Suf=Rev(Pre); int L=LG[Pre]; int PL=Pre*Pow10[L]+Suf; if(PL<=UB)Pal[++cnt]=PL; for(int p=0;p<=9;p++){ PL=Pre*Pow10[L+1]+p*Pow10[L]+Suf; if(PL<=UB)Pal[++cnt]=PL; } } sort(Pal+1,Pal+cnt+1); } inline void sub2(){ cnt=0; Gen(); int L=1,R=cnt; int ans=0; while(Pal[L]<=n){ while(Pal[R]>n-Pal[L]&&R>1)R--; if(Pal[L]+Pal[R]==n)ans++; L++; } cout<<ans<<endl; } signed main(){ Init(); cin>>n; if(n<=2000){ sub1(); return 0; } sub2(); }