Wannafly挑战赛24D-无限手套【dp】【数学】
...
- 题目:
- 题意:
- 分析:
- 代码:
题目:
传送门
题意:
有mmm种物品,数量无限,用(ai,bi,xi)(a_i,b_i,x_i)(ai,bi,xi)三元组来形容物品,xix_ixi表示我们选出该种物品多少个
对答案的贡献为∏i=1n1+aixi2+bixi\prod_{i=1}^n1+a_ix_i^2+b_ix_i∏i=1n1+aixi2+bixi
求所有方案的贡献和
分析:
设fi,jf_{i,j}fi,j表示考虑到第iii位已经考虑完前jjj种物品
会有fi,j=∑k=0ifi−k,j−1∗(ajk2+bjk+1)f_{i,j}=\sum_{k=0}^if_{i-k,j-1}*(a_jk^2+b_jk+1)fi,j=∑k=0ifi−k,j−1∗(ajk2+bjk+1)
此时复杂度为O(n2m)O(n^2m)O(n2m)
我们不妨将方程逆过来推
fi,j∗(ajk2+bjk+1)→fi+k,j+1f_{i,j}*(a_jk^2+b_jk+1)→f_{i+k,j+1}fi,j∗(ajk2+bjk+1)→fi+k,j+1
式子的左边展开得
fi,j∗ajk2+fi,j∗bjk+fi,jf_{i,j}*a_jk^2+f_{i,j}*b_jk+f_{i,j}fi,j∗ajk2+fi,j∗bjk+fi,j
我们考虑将三个单项式分开求出最后合并
阔以运用前缀和的芝士,将k2,k,1k^2,k,1k2,k,1分别用三遍,两遍,一遍前缀和来代替这个系数
其他照搬式子
复杂度就来到优秀的O(nm)O(nm)O(nm)了
当然还有更秀的生成函数,我不会,爬了
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#define LL long long
#define mo 998244353
using namespace std;
inline LL read() {LL d=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}return d*f;
}
LL a[1005],b[1005];
LL sum1[10005],sum2[10005],sum3[10005],f[10005][1005];
int main()
{LL m=read();for(LL i=1;i<=m;i++) a[i]=read(),b[i]=read();f[0][0]=1;for(LL j=0;j<m;j++){memset(sum1,0,sizeof(sum1));memset(sum2,0,sizeof(sum2));memset(sum3,0,sizeof(sum3));for(LL i=0;i<=10000;i++) {(sum1[i]+=f[i][j])%=mo;(sum2[i+1]+=f[i][j]*b[j+1]%mo)%=mo;(sum3[i+1]+=f[i][j]%mo*a[j+1]%mo)%=mo;(sum3[i+2]+=f[i][j]%mo*a[j+1]%mo)%=mo;}for(LL i=1;i<=10000;i++) (sum1[i]+=sum1[i-1])%=mo;for(LL i=1;i<=10000;i++) (sum2[i]+=sum2[i-1])%=mo;for(LL i=1;i<=10000;i++) (sum2[i]+=sum2[i-1])%=mo;for(LL i=1;i<=10000;i++) (sum3[i]+=sum3[i-1])%=mo;for(LL i=1;i<=10000;i++) (sum3[i]+=sum3[i-1])%=mo;for(LL i=1;i<=10000;i++) (sum3[i]+=sum3[i-1])%=mo;for(LL i=0;i<=10000;i++) f[i][j+1]=(sum1[i]+sum2[i]+sum3[i])%mo;}LL q=read();while(q--) printf("%lld\n",f[read()][m]);return 0;
}
Wannafly挑战赛24D-无限手套【dp】【数学】相关推荐
- Wannafly挑战赛24 无限手套(生成函数)
无限手套 每种宝石的生成函数为∑n≥0xn(ain2+bin+1)对其进行化简∑n≥0xn+∑n≥0binxn+∑n≥0ain2xn11−x+bix(1−x)2+aix(1+x)(1−x)3最后答案∏ ...
- Wannafly挑战赛24D-无限手套【dp,生成函数】
正题 题目链接:https://ac.nowcoder.com/acm/contest/186/D 题目大意 m m m个二元组 ( a i , b i ) (a_i,b_i) (ai,bi),对 ...
- Wannafly挑战赛24 D 无限手套
文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...
- 【nowcoder 186D / 19153】无限手套(DP)(生成函数)
无限手套 题目链接:nowcoder 186D / 19153 题目大意 有 n 种物品,每个物品有一个权值 a,b,你选 x 个的费用就是 ax^2+bx+1,然后总费用是每类物品的费用的乘积. 然 ...
- Wannafly挑战赛24
Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- [Wannafly挑战赛2D-Delete]最短路
[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...
- Wannafly挑战赛19
Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...
- Wannafly挑战赛18
Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...
最新文章
- 每日一皮:在同一个项目上工作2年的样子...
- python手机版怎么用-如何优雅的在手机上进行Python编程
- NIO:channel、buffer、状态变量、socket、charset
- 注册jdbc驱动程序的三种方式
- 新浪宣布2010年第四季度业绩 盘后跌4%
- 模拟银行自助终端系统
- if快还是switch快?解密switch背后的秘密
- java的值排序总结
- 列名 userid 不明确。 表结构_SQL-Server(三)表的创建和操作
- Remoting例子-使用配置文件
- Screen Saver Exporter for Mac(屏幕保护程序导出程序)
- 定义类,super的使用,super的使用
- 工程项目管理(EPC)系统全套流程详细解读(含流程图)
- 【unity 保卫星城】--- 开发笔记(Demo演示篇)
- robocup3d 发布比赛版本
- android手机文件误删除恢复软件,被误删除的文件用安卓手机数据恢复软件怎么找回...
- 遭遇裁员,如何渡过心理危机?
- 《摩诃般若波罗蜜多心经》 玄奘 译
- 上海计算机一级ps教程,2017年计算机一级考试PS学习妙招
- 使用DM数据迁移工具将Excel数据导入到达梦数据库