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) (题于文末) 知识点: 母函数(生成函数): 生成函数有普通型生成函数和指数型生成函数 ...
随机推荐
- Hello Shell
shell是Linux平台的瑞士军刀,能够自动化完成很多工作.要了解UNIX 系统中可用的 Shell,可以使用 cat /etc/shells 命令.使用 chsh 命令 更改为所列出的任何 She ...
- vijos 1053 Easy sssp
描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...
- 面向对象的设计的SOLID原则
S.O.L.I.D是面向对象设计和编程中5个重要编码规则的首字母的缩写. - SRP The Single Responsibility Principle 单一责任原则 当需要修改某个类的时候原因有 ...
- 光线步进——RayMarching入门
入门实现 先用RayMarching描绘一个球体,最后在进行光照计算参考:https://www.shadertoy.com/view/llt3R4 模拟摄像机射线float3 rayDirectio ...
- 什么是python 中的顶层代码?
在python语言中我们经常会听到顶层代码的说法,但是什么是顶层代码? 在python中,我们是以缩进来区分代码层次的,所以顶层代码指的是缩进为0个空格的代码. 看如下例子: PP = 3.14 de ...
- docker 深入理解之cgroups
cgroups 资源限制 cgroups 是什么 cgroups 最初名为process container,有Google工程师Paul Menage和Rohit Seth于 2006 年提出,后由 ...
- LayuiAdmin退出模块报错解决
将layuiAdmin/src/controller目录下的common.js中 logout方法的url中logout.js的路径修改为自己目录的路径: 我这里修改为绝对路径:
- github下拉刷新与上拉加载地址
https://github.com/chrisbanes/Android-PullToRefresh
- Intel CPU参数查询网站
链接:https://ark.intel.com/#@Processors
- POJ-3278 抓住这头牛
广搜解决. 广搜搜出最短路,直接输出返回就行了. 每个点只搜一次,而且界限进行一次判断. else 语句里面不要用if else if,这样的话就直走一条路了. #include <ios ...