求长度为L的被m整除的回文串的个数
建立状态:d(i,j)表示第i位模m的余数为j的个数
d(i,j)=d(i+1,j+k*10^i)(L为奇数且最中间的情况)
d(i,j)=d(i+1,j+k*(10^i+10^L-1-i))(其他情况,k从0到9,从一半开始递推)
#include <stdio.h>
#include <string.h>
#define LL long long
LL d[25][1050];
LL p[25];
int main()
{
int T,m,s;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&s);
p[0]=1;
for(int i=1;i<=s;i++)
p[i]=p[i-1]*10%m;
memset(d,0,sizeof(d));
d[(s-1)/2+1][0]=1;
for(int i=(s-1)/2;i>=0;i--)
{
for(int j=0;j<m;j++)
{
for(int k=(i==0);k<=9;k++)
{
if((s&1)&&i==s-1-i)
{
d[i][j]+=d[i+1][(j+k*p[i])%m];
}
else
{
d[i][j]+=d[i+1][(j+k*(p[i]+p[s-1-i]))%m];
}
}
}
}
printf("%lld\n",d[0][0]);
}
return 0;
}