HDU&POJ训练记录4 生成函数
来源:互联网 发布:视频剪辑软件格式工厂 编辑:程序博客网 时间:2024/06/10 13:13
1、Ignatius and the Princess III
传送门
题意简述
求将n拆分成若干整数的方案数。
数据范围
题解
首先构造用每一个数能构成的数的生成函数,然后相乘
然后将多项式展开,
那么可以
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 150int n;int a[N],b[N];int main(){ while (~scanf("%d",&n)) { for (int i=0;i<=n;++i) a[i]=1,b[i]=0; for (int i=2;i<=n;++i) { for (int j=0;j<=n;++j) for (int k=0;k<=n;k+=i) b[j+k]+=a[j]; for (int j=0;j<=n;++j) a[j]=b[j],b[j]=0; } printf("%d\n",a[n]); }}
2、Square Coins
传送门
题意简述
求将n划分成若干个完全平方数的方案数。
数据范围
题解
和上一题相似,构造用每一个完全平方数的生成函数,然后相乘
然后将多项式展开,
那么可以
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 600int n,m,qr[N],a[N],b[N];int main(){ for (int i=1;i<=18;++i) qr[i]=i*i; while (~scanf("%d",&m)) { if (!m) break; for (n=1;qr[n+1]<=m;++n); for (int i=0;i<=m;++i) a[i]=1,b[i]=0; for (int i=2;i<=n;++i) { for (int j=0;j<=m;++j) for (int k=0;k<=m;k+=qr[i]) b[j+k]+=a[j]; for (int j=0;j<=m;++j) a[j]=b[j],b[j]=0; } printf("%d\n",a[m]); }}
3、Holding Bin-Laden Captive!
传送门
题意简述
有a个1,b个2,c个5,问最小的无法组合出的数。
数据范围
题解
和之前的方法都是差不多的
分别构造1,2,5的生成函数,这里是一个有限数列
将多项式展开,然后找一个次数最小的没有系数的项即可
时间
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 10000int x,y,z,ans;int a[N],b[N];int main(){ while (~scanf("%d%d%d",&x,&y,&z)) { if (!x&&!y&&!z) break; memset(a,0,sizeof(a));memset(b,0,sizeof(b)); for (int i=0;i<=x;++i) a[i]=1; for (int i=0;i<=x;++i) for (int j=0;j<=y<<1;j+=2) b[i+j]+=a[i]; for (int i=0;i<=x+(y<<1);++i) a[i]=b[i],b[i]=0; for (int i=0;i<=x+(y<<1);++i) for (int j=0;j<=z*5;j+=5) b[i+j]+=a[i]; for (ans=1;ans<=x+(y<<1)+z*5;++ans) if (!b[ans]) break; printf("%d\n",ans); }}
4、Big Event in HDU
传送门
题意简述
有n种东西,每一个的权值为v,有m个。将这些东西分成两拨,让权值和尽量接近。
数据范围
题解
判断读入结束是一个负数,并不一定是-1,wa了好久。。
首先用生成函数求出来那些权值能被组合出来,然后枚举一下[m/2..0]范围内的就行了
时间
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 300000int n,m,x,y;int a[N],b[N];int main(){ while (~scanf("%d",&n)) { if (n<0) break; memset(a,0,sizeof(a));memset(b,0,sizeof(b)); scanf("%d%d",&x,&y); for (int i=0;i<=y;++i) a[x*i]=1; m=x*y; for (int i=2;i<=n;++i) { scanf("%d%d",&x,&y); for (int j=0;j<=m;++j) for (int k=0;k<=y;++k) b[j+x*k]+=a[j]; m+=x*y; for (int j=0;j<=m;++j) a[j]=b[j],b[j]=0; } for (int i=m/2;i>=0;--i) if (a[i]) { printf("%d %d\n",m-i,i); break; } }}
5、Blocks
传送门
题意简述
用红黄蓝绿给n个格子染色,要求红色和绿色必须是偶数个,求方案数。对10007取模。
数据范围
题解
因为牵扯到排列问题,需要用到指数型生成函数
设方案数为
所以这道题的答案就是
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define Mod 10007int T,n;int fast_pow(int a,int p){ int ans=1; for (;p;p>>=1,a=a*a%Mod) if (p&1) ans=ans*a%Mod; return ans;}int main(){ scanf("%d",&T); while (T--) { scanf("%d",&n); printf("%d\n",(fast_pow(4,n-1)+fast_pow(2,n-1))%Mod); }}
6、排列组合
传送门
题意简述
有n种物品,每种有
数据范围
题解
排列问题,用到指数型生成函数
指数表示出现的次数,写出生成函数应该是
然后将多项式展开求第m项的系数
过程中暴力做多项式乘法用double,注意c++强转int是向0取整
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int n,m,x;double mul[50],a[50],b[50];int main(){ mul[0]=1.0; for (int i=1;i<=10;++i) mul[i]=mul[i-1]*(double)i; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a));memset(b,0,sizeof(b)); scanf("%d",&x); for (int i=0;i<=min(m,x);++i) a[i]=1.0/mul[i]; for (int i=2;i<=n;++i) { scanf("%d",&x); for (int j=0;j<=m;++j) for (int k=0;k<=min(m,x);++k) b[j+k]+=a[j]*(1/mul[k]); for (int j=0;j<=m;++j) a[j]=b[j],b[j]=0.0; } printf("%.0lf\n",a[m]*mul[m]); }}
- HDU&POJ训练记录4 生成函数
- HDU&POJ训练记录3 二分图KM算法
- HDU训练记录1:KMP
- POJ训练记录1:置换群
- HDU训练记录2:基础数位dp
- hdu 2566 生成函数
- hdu 2152 生成函数
- 生成函数hdu 1028
- 生成函数hdu 1085
- 母函数训练C题 HDU 1085
- [训练记录]
- 训练记录
- POJ训练计划1789_Truck History(最小生成树)
- POJ训练计划3026_Borg Maze(最小生成树+BFS)
- POJ训练计划2485_Highways(最小生成树)
- POJ训练计划1258_Agri-Net(最小生成树)
- POJ-1251 HDU-1301 (最小生成树)
- sql 四个排名函数 生成记录序号
- APK反编译工具使用
- addEventListener与onclick的比较
- Android中的转屏流程
- 腾讯面试问题总结
- javaEE如何统计日访问量和总访问量
- HDU&POJ训练记录4 生成函数
- 多态和动态绑定--定义
- JONS数据转化为excel数据
- linux下如何添加一个用户并且让用户获得root权限
- js实现获取两个日期之间所有日期最简单的方法
- 前端开源项目周报0425
- ios 字典enumerateKeysAndObjectsUsingBlock遍历
- git拉取远程分支并创建本地分支
- MyBatis 动态 SQL 底层原理分析