传送门:UNIMODAL PALINDROMIC DECOMPOSITIONS
UNIMODAL PALINDROMIC DECOMPOSITIONS
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4741 | Accepted: 2330 |
Description
A sequence of positive integers is Palindromic if it reads the same forward and backward. For example:
23 11 15 1 37 37 1 15 11 23
1 1 2 3 4 7 7 10 7 7 4 3 2 1 1
A Palindromic sequence is Unimodal Palindromic if the values do not decrease up to the middle value and then (since the sequence is palindromic) do not increase from the middle to the end For example, the first example sequence above is NOT Unimodal Palindromic while the second example is.
A Unimodal Palindromic sequence is a Unimodal Palindromic Decomposition of an integer N, if the sum of the integers in the sequence is N. For example, all of the Unimodal Palindromic Decompositions of the first few integers are given below:
1: (1)
2: (2), (1 1)
3: (3), (1 1 1)
4: (4), (1 2 1), (2 2), (1 1 1 1)
5: (5), (1 3 1), (1 1 1 1 1)
6: (6), (1 4 1), (2 2 2), (1 1 2 1 1), (3 3),
(1 2 2 1), ( 1 1 1 1 1 1)
7: (7), (1 5 1), (2 3 2), (1 1 3 1 1), (1 1 1 1 1 1 1)
8: (8), (1 6 1), (2 4 2), (1 1 4 1 1), (1 2 2 2 1),
(1 1 1 2 1 1 1), ( 4 4), (1 3 3 1), (2 2 2 2),
(1 1 2 2 1 1), (1 1 1 1 1 1 1 1)
Write a program, which computes the number of Unimodal Palindromic Decompositions of an integer.
23 11 15 1 37 37 1 15 11 23
1 1 2 3 4 7 7 10 7 7 4 3 2 1 1
A Palindromic sequence is Unimodal Palindromic if the values do not decrease up to the middle value and then (since the sequence is palindromic) do not increase from the middle to the end For example, the first example sequence above is NOT Unimodal Palindromic while the second example is.
A Unimodal Palindromic sequence is a Unimodal Palindromic Decomposition of an integer N, if the sum of the integers in the sequence is N. For example, all of the Unimodal Palindromic Decompositions of the first few integers are given below:
1: (1)
2: (2), (1 1)
3: (3), (1 1 1)
4: (4), (1 2 1), (2 2), (1 1 1 1)
5: (5), (1 3 1), (1 1 1 1 1)
6: (6), (1 4 1), (2 2 2), (1 1 2 1 1), (3 3),
(1 2 2 1), ( 1 1 1 1 1 1)
7: (7), (1 5 1), (2 3 2), (1 1 3 1 1), (1 1 1 1 1 1 1)
8: (8), (1 6 1), (2 4 2), (1 1 4 1 1), (1 2 2 2 1),
(1 1 1 2 1 1 1), ( 4 4), (1 3 3 1), (2 2 2 2),
(1 1 2 2 1 1), (1 1 1 1 1 1 1 1)
Write a program, which computes the number of Unimodal Palindromic Decompositions of an integer.
Input
Input consists of a sequence of positive integers, one per line ending with a 0 (zero) indicating the end.
Output
For each input value except the last, the output is a line containing the input value followed by a space, then the number of Unimodal Palindromic Decompositions of the input value. See the example on the next page.
Sample Input
2 3 4 5 6 7 8 10 23 24 131 213 92 0
Sample Output
2 2 3 2 4 4 5 3 6 7 7 5 8 11 10 17 23 104 24 199 131 5010688 213 1055852590 92 331143
Source
解题报告:
【题目大意】:给出一个数n,把它拆分成若干个数的和,要求最大的数在中间并向两边非递增。问拆法有多少种。
【解题思路】:母函数。枚举中间的那一个数,因为左右对称,所以只需要求左边部分的方案即可。注意,左右两部分的取数必须小于中间的数,中间的数是0的话则以n为最大取值。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int c1[500], c2[500];
long long solve(long long m,long long n){
int i,j,k;
for(i=0;i<=n;i++){
c1[i]=1;
c2[i]=0;
}
if(m==0) m=n;
for(i=2; i<=m; i++){
for(j=0; j<=n; j++)
for(k=0; k+j<=n; k+=i)
c2[j+k] += c1[j];
for(j=0; j<=n; j++){
c1[j] = c2[j];
c2[j] = 0;
}
}
return c1[n];
}
int main(){
int n;
int i, j, k;
while(scanf("%d",&n)){
if(n==0)
break;
long long ans=0;
for(i=0;i<=n;i++)
if((n-i)%2==0) {
long long tmp=solve(i,(n-i)/2);
ans+=tmp;
}
printf("%d %lld\n",n,ans);
}
return 0;
}