HDU 1028 整数拆分 HDU 2082 找单词 母函数
生成函数(母函数)
母函数又称生成函数。定义是给出序列:a0,a1,a2,...ak,...an,
那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn 称为序列a0,a1,a2,.......ak,......的母函数(即生成函数)。
1. 问题 n=x1+x2+x3+...+xk有多少个非负整数解?这道题是学排列与组合的经典例题了。
把每组解的每个数都加1,就变成n+k=x1+x2+x3+...+xk的正整数解的个数了。
教材上或许会出现这么一个难听的名字叫“隔板法”:把n+k个东西排成一排,在n+k-1个空格中插入k-1个“隔板”。
答案我们总是知道的,就是C(n+k-1,k-1)。它就等于C(n+k-1,n)。
它关于n的生成函数是g(x)=1/(1-x)^k。
2. 这个公式非常有用,是把一个生成函数还原为数列的武器。而且还是核武器。1/(1-x)^n=1+C(n,1)x^1+C(n+1,2)x^2+C(n+2,3)x^3+...+C(n+k-1,k)x^k+...。
找单词
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9784 Accepted Submission(s): 6805
然后包括N行数据,每行包括26个<=20的整数x1,x2,.....x26.
+
…
) (1+
+
+…
)…(1+
+…
) 每一个多项式 i 有xi+1项 然后多项式乘法就好了#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl;
using namespace std;
const int maxn= 1e2+;
const int inf = 0x3f3f3f3f;
typedef long long ll;
ll a[maxn],b[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
fillchar(a,);
fillchar(b,);
a[]=;
for(int i=;i<=;i++)
{
int x;
cin>>x;
for(int j=;j<=;j++)
{
for(int k=;k<=x&&(j+i*k<=);k++)
{
b[j+k*i]+=a[j];
} }
for(int j=;j<=;j++)
{
a[j]=b[j];
b[j]=;
}
}
ll ans=;
for(int i=;i<=;i++)
{
ans+=a[i];
}
cout<<ans<<endl;
}
}
Ignatius and the Princess III
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 25750 Accepted Submission(s): 17803
"The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+...+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
递推法
的值为多少(n>0),只有一种划分,即{1,1,....1,1,1};
的情况,即{m,{x1,x2,x3,...,xi}},其中{x1,x2,x3,...,xi}的和为n-m,可能再次出现m,因此是(n-m)的m划分,因此这种划分个数为f(n-m,m;#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl;
using namespace std;
const int maxn= 1e2+;
const int inf = 0x3f3f3f3f;
typedef long long ll;
ll a[maxn],b[maxn];
int main()
{
int n;
while(cin>>n)
{
fillchar(a,);
fillchar(b,);
a[]=;
for(int i=;i<=n;i++) //枚举第i个多项式 每一项的系数都为1
{
for(int j=;j<=n;j++) //保留x0----xn项
{
for(int k=;j+i*k<=n;k++) //枚举第i个多项式的每一项
{
b[j+k*i]+=a[j]; //b数组保存中间值
} }
for(int j=;j<=n;j++)
{
a[j]=b[j]; //b数组传值给a
b[j]=;
}
}
cout<<a[n]<<endl;
}
}
/*----------------------------------------------------------------------------------------*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//记忆化递归法求解整数划分
ll ans[][];
ll GetPartitionCount(int n, int m)
{
if(ans[n][m]>)
return ans[n][m];
if (n == || m == )return ans[n][m]=;
if (n < m)return ans[n][m]=(GetPartitionCount(n, n));
if (n == m)return ans[n][m]=( + GetPartitionCount(n, n - ));
else return ans[n][m]=(GetPartitionCount(n - m, m) + GetPartitionCount(n, m - ));
} int main()
{
int n,m;
ll sum;
while (scanf("%d",&n)==)
{
memset(ans,,sizeof(ans));
m=n;
sum = GetPartitionCount(n, m);
printf("%lld\n", sum);
}
return ;
}
HDU 1028 整数拆分 HDU 2082 找单词 母函数的更多相关文章
- Ignatius and the Princess III HDU - 1028 || 整数拆分,母函数
Ignatius and the Princess III HDU - 1028 整数划分问题 假的dp(复杂度不对) #include<cstdio> #include<cstri ...
- HDOJ 2082 找单词 (母函数)
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu,1028,整数拆分的理解
#include"iostream"using namespace std;int main() { int n,i,j,k; int c[122],temp[122]; //c[ ...
- HDU 1028 整数拆分问题 Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 2082 找单词 (普通型 数量有限 母函数)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others) Me ...
- hdu acm 2082 找单词
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1028 Ignatius and the Princess III(母函数整数拆分)
链接:传送门 题意:一个数n有多少种拆分方法 思路:典型母函数在整数拆分上的应用 /********************************************************** ...
- HDU 1028 Ignatius and the Princess III (生成函数/母函数)
题目链接:HDU 1028 Problem Description "Well, it seems the first problem is too easy. I will let you ...
- hdu2082 找单词 (母函数)
找单词 题意: 中文题,考虑是不是要写个英文题意..(可惜英语水平不够 囧rz) (题于文末) 知识点: 母函数(生成函数): 生成函数有普通型生成函数和指数型生成函数 ...
随机推荐
- B/S网络架构
B/S基于统一的应用层协议HTTP来交互数据,目前的B/S网络架构大多采用如图所示的架构设计,既要满足海量用户访问请求,又要保持用户请求的快速响应. 当一个用户在浏览器输入www.taobao.com ...
- Android单独继承View类来实现自定义控件
一个单独继承view类来实现自定义控件,在该方法中,需要重写ondraw方法来绘制自己所需要的控件,下面也以一个简单的例子来说明如何实现自定义控件.该方法可以实现所需要的所有的自定义控件. 属性文件中 ...
- CPLD
复杂可编程逻辑器件(Complex Programmable Logic Device, CPLD),CPLD适合用来实现各种运算和组合逻辑(combinational logic).一颗CPLD内等 ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- JDBC优化策略总结
相比Hibernate.iBatis.DBUtils等,理论上JDBC的性能都超过它们.JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的. 在一些高性能的数据操作中, ...
- virtualbox没有64位选项
今天安装的virtualbox想安装一下sql server 测试一下 在安装系统的时候发现没有64位系统的选项,在网上找了一下 发现是 在BIOS里面有一个选项没有开启, 是 Intel virt ...
- swift Equatable 函数签名的测试
struct Degoo:Equatable { var lex:String var pex:String static func == (left:Degoo, right:Degoo) -> ...
- Python 循环结构语句
1.for循环:计次循环 2.while循环:条件循环 3.嵌套循环 4.跳转语句 一.for循环的使用 1.进行数值循环 利用数值循环输出三次‘你好’: >>> for i in ...
- 骑芯供应链(T 面试)
1.目前市面上主流的团队开发模式是什么? 正解:DevOps,https://blog.csdn.net/bntX2jSQfEHy7/article/details/79168865 2.你觉得什么是 ...
- delphi 动态调用API
好处没有这个API 也可以启动程序只是调用会出错. function __IsNativeVhdBoot: Boolean; type TIsNativeVhdBoot = function( Nat ...