这道题运行不成功,样例也过不了,求助大神!!!
【问题描述】
大家都知道回文串吧~ 简单地说就是左右对称的一个串,比如 abcba,werrew。小 s 对回文串的研究已经够深刻了,现在她转而研究其他方面的回文,比如,数的回文拆分。对于自然数的拆分,就是把一个自然数 N 用若干个整数之和表示。比如 5=1+2+3+4+5=1+2+1+7+1+2+1。那么怎样的拆分才算是回文的呢?我们用从归纳的角度来定义数的回文拆分。首先一个数A=A 是一个回文拆分。其次,一个自然数 N=A+A 或是 N=A+x+A,其中 A 是一个回文拆分,x 是任意一个自然数, 这两种也是回文拆分。举个例子, 7 的所有回文拆分有: 7,1+5+1,2+3+2,1+1+3+1+1,3+1+3,1+1+1+1+1+1+1。现在小 s 想知道,一个正整数 N 的回文拆分到底有多少种。由于这个数字可能很大,小 s 只需要你告诉她答案除以 1,000,000,007 的余数的值。
【输入格式】
一行,一个正整数 N
【输出格式】
一行,一个整数 M,为 N 的回文拆分数%(mod) 1,000,000,007 的值
【样例输入 1】4
【样例输出 1】4
【样例输入 2】20
【样例输出 2】60
【数据范围】30% 1<=N<=20, 100% 1<=N<=1000
#include<bits/stdc++.h>
using namespace std;
int n,total=0;
int a[1001]={1};
int b[1001]={0},c[1001]={0};
int d[1001]={0};
bool turn(int h){
int max=0;
memset(d,sizeof(d),0);
for(int i=1;i<=h;i++){
d[b[i]]++;
if(b[i]>max) max=b[i];
}
int qs=0;
for(int i=1;i<=max;i++){
if(d[i]% 2==1) qs++;
}
if(qs>1) return false;
else if(qs==1||qs==0) return true;
}
bool ispalin(int k){
int p=0;
for(int i=1;i<=k;i++){
p++;
if(a[i]<10) b[p]=a[i];
else if(a[i]<100){
b[p]=a[i]/10;
p++;
b[p]=a[i]% 10;
}
else if(a[i]<1000){
b[p]=a[i]/100;
p++;
b[p]=(a[i]% 100)/10;
p++;
b[p]=(a[i]% 100)% 10;
}
else if(a[i]==1000){
b[p]=1;
p+=3;
}
}
int q=0;
for(int i=p;i>=1;i--){
q++;
c[q]=b[i];
}
for(int i=1;i<=p;i++){
if(b[i]!=c[i]){
if(turn(p)) return true;
else return false;
}
}
return true;
}
int search(int s,int t){
for(int i=a[t-1];i<=s;i++)
{
if(i<n)
{
a[t]=i;
s-=i;
if(s==0){
if(ispalin(t)) total++;
}
else search(s,t+1);
s+=i;
}
}
}
int main()
{
cin>>n;
search(n,1);
cout<<total% 1000000007+1<<endl;
return 0;
}
这是我的代码,请帮忙找一下哪里出错了(QAQ)