2014校选题(二)-- 母函数问题

来源:互联网 发布:相片添加日期软件 编辑:程序博客网 时间:2024/06/08 18:56

题目二

问题描述

排列组合问题中,分割是个有趣的问题。分割的意思,是把一個数字切成很多小部分之后,要保持总和不变。例如a+b+c=5, 而a,b,c都要是整数。则可能的情況是1+1+3,或是1+3+1或是1+2+2…等有很多个。現在为了简化问题,我们只想知道输入一个数字N,请问只用1,2,3三个数字字来切,則共有几种不同的组合方式?请输出全部的组合。

例如N=5,则输出 5=1+1+1+1+1=1+1+1+2=1+1+3=1+2+2=2+3 ,共有5种可能。

若N=6,则输出6=1+1+1+1+1+1=1+1+1+1+2=1+1+1+3=1+1+2+2=1+2+3=2+2+2=3+3共有7种可能。

【输入】

每行一个样本,在那一行中,只有一个数字N,保证在1到15之间。

输出

每个样本,有很多行输出。每行代表一种可能,请输出全部可能的组合情形。输出来的顺序可以与范例不同。但总数要相同。另外,每个样本之间用一个空白行隔开。

【样例输入】

6

样例输出

1+1+1+1+1+1

1+1+1+1+2

1+1+1+3

1+1+2+2

1+2+3

2+2+2

3+3



//这道题考察母函数,将母函数模板看会后再做此题 so easy~~

/*************************title: 母函数问题**time: 2014.4.23************************/#include <stdio.h>void print(int i, int j, int k){int n;if (i != 0){n = i;for (i = 1; i < n; i++){printf("1 + ");}printf("1");}if (j != 0){n = j / 2;if (i != 0){printf(" + ");}for (j = 1; j < n; j++){printf("2 + ");}printf("2");}if (k != 0){n = k / 3;if (i || j){printf(" + ");}for (k = 1; k < n; k++){printf("3 + ");}printf("3");}printf("\n");}int main(){int n;while (~scanf("%d", &n)){int j;int i;int k;for (i = 0 ; i <= n; i++)  //表示(1 + x + x^2 + x^3.....)的系数{for (j = 0; j + i <= n; j += 2)  //表示(1 + x^2 + x^4.....)的系数{for (k = 0; k+i+j <= n ; k += 3)  //表示(1 + x^3 + x^6.....)  的系数{if (!(i==0 && j==0 && k==3 ||              // 防止 输入n=1,2,3 多项式结果包含单项式1,2,3的情况i==0 && k==0 && j==2 || j==0 && k==0 && i==1))  {if (k + i + j == n){print(i, j, k);}}}}}}return 0;}




0 0