题目大意:给定D,询问有多少个数,它的翻转减去它本身等于D
题解做法很无脑,利用的是2^(L/2)的dfs,妥妥超时
于是找到了一种神奇的做法。
#include <iostream> using namespace std; typedef long long ll; ll D; ll hoge(ll A,ll t,int first) { if(t==0) return A==0; int v=(A%10+10)%10; ll ret=0; ret+=(10-v-first)*hoge((A-t*v)/10,t/100,0); ret+=(v-first)*hoge((A+(10-v)*t)/10,t/100,0); return ret; } void solve() { int i,j,k,l,r,x,y; string s; cin>>D; if(D%9) { cout<<0<<endl; return; } D/=9; ll ret=0; ll p10=10; for(i=2;i<=18;i++) { p10*=10; ll tot=(i%2)?10:1; ret += tot*hoge(D,p10/10/9,1); } cout<<ret<<endl; } int main() { solve(); }