题目求助!!!
  • 板块灌水区
  • 楼主Gnimnehs
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/13 16:12
  • 上次更新2023/10/27 15:36:06
查看原帖
题目求助!!!
772337
Gnimnehs楼主2022/8/13 16:12

这道题运行不成功,样例也过不了,求助大神!!!

【问题描述】

大家都知道回文串吧~ 简单地说就是左右对称的一个串,比如 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)

2022/8/13 16:12
加载中...