/*
HDU 6042 - Journey with Knapsack [ 生成函数,五边形定理 ] | 2017 Multi-University Training Contest 1
题意:
n种物品,每种 a[i] 个,体积为 i,m 个武器,每个体积为 b[i]
求2*n大小的背包里只能装一个武器,任意食物的方案数
限制条件:
a[i]各不相同且 0 <= a[1] <= a[2] <= ... a[n] <= 2*n
n <= 5e4
分析:
先不考虑武器,求出任意i <= 2*n 的放食物的方案数ans[2*n],答案即为 ∑ ans[2*n - b[i]]
其实本质和整数划分相同,限制了每个数字选择的次数
考虑选择食物的生成函数:
第i种食物的贡献因子 f(x) = 1 + x^i + x^2i + ... + x^(a[i]*i) = ( 1 - x^((ai+1)*i) ) / ( 1 - x^i )
故 F(x) = ∏ f(i) [1<=i<=n]
= ∏ (1 - x^((ai+1)*i)) / (1-x^i) [1<=i<=n]
= ∏ (1 - x^((ai+1)*i)) [1<=i<=n] * ∏ 1/(1-x^i) [1<=i<=n] 研究一下乘号左边这一项累乘:
假设已求得乘号右边这一项 F'(x) = ∏ 1/(1-x^i) [1<=i<=2*n] = ∑ dp[i]*x^i [1<=i<=2*n]
则两边多项式合并时,相当于一个n项的多项式(右边) 和 n个两项的多项式(左边)相乘
假设左边第i项 (1 - x^((ai+1)*i)) 与 F'(x) 合并,则:
(1 - x^((ai+1)*i)) * ( ∑ dp[j]*x^j [1<=j<=2*n] ) = ∑ dp[j]*x^j [1<=j<=n] - ∑ dp[j-(ai+1)*i] * x^j [(ai+1)*i) <= j <= 2*n+(ai+1)*i)] (多项式右移(ai+1)*i)次)
由于体积只有2*n大小,故x^(2*n+1)项及以后无意义
故上式 = ∑ dp[j]*x^j [1<=j<=n] - ∑ dp[j-(ai+1)*i] * x^j [(ai+1)*i) <= j <= 2*n]
= ∑ dp[j]*x^j [1<=j< (ai+1)*i)] + ∑ (dp[j]- dp[j-(ai+1)*i])*x^j [(ai+1)*i) <= j <= 2*n]
即对于所有 (ai+1)*i <= j <= 2*n 的项,执行操作:
dp[j] = dp[j] - dp[j-a(i+1)*i] (按01背包形式,至高往低) 由于合并后 F'(x) 形式不变,故可循环合并 n 次
单次合并复杂度 O(2*n - a(i+1)*i) = O(n)
根据限制条件 0 <= a[1] <= a[2] <= ... a[n] <= 2*n ,可推得 ai >= i-1, (ai+1)*i >= i^2 (鸽巢原理)
故 (ai+1)*i <= 2*n 的项只有 O(n^0.5) 项
故合并总时间复杂度 O(n^1.5) 研究一下乘号右边这一项累乘:
其形式与无限制的整数划分的方案数的生成函数相同,由于目前只有n项累乘,按题意先补齐至2n项
F'(x) = ∏ 1/(1-x^i) [1<=i<=n]
= ∏ 1/(1-x^i) [1<=i<=2n] * ∏ (1-x^i) [n+1<=i<=2n] 乘号左边这一项 P(x) 即2*n以内无限制的整数划分的方案数,根据五边形定理可以在 O(n^1.5) 预处理出 观察乘号右边那一项,虽然形式与上面讨论的累乘形式相近,但可以分析暴力合并复杂度 O(n^2)
打开这个累乘,由于 n+1<=i<=2n ,任意两项 x^i * x^j = x^(i+j) ,此时i+j > 2*n
故去掉指数为 2n 以上的无效项后:
∏ (1-x^i) [n+1<=i<=2n] = 1 - ∑x^i [n+1<=i<=2n]
F'(x) = P(x) * ( 1 - ∑x^i ) [n+1<=i<=2n]
令 P(x) = ∑ dp[i]*x^i [1<=i<=2n],考虑合并:
F'(x) = ∑ dp[i] * x^i [1<=i<=2n]
- ∑ dp[i-n-1] * x^i [n+1<=i<=2n]
- ∑ dp[i-n-2] * x^i [n+2<=i<=2n]
- ∑ dp[i-n-3] * x^i [n+3<=i<=2n]
- ...
= ∑ dp[i] * x^i [1<=i<=n]
+ ∑ x^(n+1) * (dp[n+1] - dp[0])
+ ∑ x^(n+2) * (dp[n+1] - dp[0] - dp[1])
+ ∑ x^(n+2) * (dp[n+1] - dp[0] - dp[1] - dp[2])
...
即对于所有 n+1 <= j <= 2*n 的项,执行操作:
dp[j] = dp[j] - sum[j-n-1], sum[]为dp[]的前缀和
合并复杂度O(n) 总时间复杂度O(n^1.5)
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = 1e9+7;
const int N = 100005;
LL Qn[3000], f[N];//五边形数,整数划分生成函数
void Init() {
for (int i = 1; i <= 2000; i += 2) {
LL n = (i+1)/2;
Qn[i] = (3*n*n - n) / 2;
Qn[i+1] = (3*n*n + n) / 2;
}
f[0] = 1;
for (int i = 1; i < N; i++)
for (int j = 1, r = 1; j <= 2000; j += 2, r *= -1) {
if (i - Qn[j] < 0) break;
f[i] = (f[i] + f[i-Qn[j]] * r + MOD) % MOD;
if (i - Qn[j+1] < 0) break;
f[i] = (f[i] + f[i-Qn[j+1]] * r + MOD) % MOD;
}
}
LL dp[N];
int n, m, tt;
int main()
{
Init(); tt = 0;
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i <= n<<1; i++) dp[i] = f[i];
for (int i = 1; i <= n; i++)
{
LL a, b; scanf("%lld", &a); b = i*(a+1);
for (int j = n<<1; j >= b; j--)
dp[j] = (dp[j] + MOD - dp[j-b]) % MOD;
}
for (int j = n+1, sum = 0; j <= n<<1; j++)
{
sum = (sum + dp[j-n-1]) % MOD;
dp[j] = (dp[j] + MOD - sum) % MOD;
}
LL ans = 0;
while (m--)
{
int x; scanf("%d", &x);
ans = (ans + dp[2*n-x]) % MOD;
}
printf("Case #%d: %lld\n", ++tt, ans % MOD);
}
}

* 修正了写错的公式

HDU 6042 - Journey with Knapsack | 2017 Multi-University Training Contest 1的更多相关文章

  1. HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9

    /* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...

  2. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  3. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  4. 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数

    /** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...

  5. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  6. hdu 6406 Taotao Picks Apples (2018 Multi-University Training Contest 8 1010)(二分,前缀和)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6406 思路: 暴力,预处理三个前缀和:[1,n]桃子会被摘掉,1到当前点的最大值,1到当前点被摘掉的桃子的 ...

  7. hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6319 思路: 单调队列倒着维护,队列里面剩下的值的数量就是这一段区间的count值,如样例第一个区间:3 ...

  8. HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)

    思路: 只有速度最大才有可能为1,速度不是最大肯定为0,那么就是 只需要操作那些速度最大的点,这些点求一个凸包,判断一下是不是在凸包边上即可. 有几个需要注意的地方: 1.最大速度如果为0   那么肯 ...

  9. HDU 4939 Stupid Tower Defense (2014 Multi-University Training Contest 7)

    思路:首先红色肯定要放在最后面.前面蓝色和绿色dp求解. dp[i][j]  表示前面(i+j) 个 有 i 个蓝色塔  j个绿色塔 能造成最大伤害. //====================== ...

随机推荐

  1. 【k8s第二步】Kubernetes-Kubeadm部署安装【已修正错误】

    ⒈开启kube-proxy的ipvs的前置条件 模式改为lvs调度的方式,kube-proxy主要解决的是svc(service)与pod之间的调度关系,ipvs的调度方式可以极大的增加它的访问效率, ...

  2. spring mvc 的配置 及interceptor filter listener servlet 配置

    创建 三个类 分别实现 Filter  ServletContextListener  HttpServlet 在springboot 启动类中@bean加入 2 ,实现 ServletContext ...

  3. 基于NIO写的阻塞式和非阻塞式的客户端服务端

    由于功能太过简单,就不过多阐述了,直接上阻塞式代码: package com.lql.nio; import org.junit.Test; import java.io.IOException; i ...

  4. 认识函数(python)

    一般的函数都是有参数的,函数的参数都是放在函数定义的括号里的,函数参数的命名规则和我们说的变量的命名规则基本一样,一定要清晰明了.(能概括出它的意义,让人阅读你的代码,就知道这个参数是干嘛的就行).当 ...

  5. # 使用scatter()绘制散点图

    使用scatter()绘制散点图 之前写过一篇,使用magic function快速绘图的教程了:https://www.cnblogs.com/jiading/p/11750001.html.但这种 ...

  6. 13 Msql之四种事务隔离界别

    一.事务的基本要素 1.原子性:事务开始后的所有操作,要么全部做完,要么全部不做,不能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没发生一样.也就是说事务是一个不可分割 ...

  7. css四种定位

    概述:元素定位属性主要包括的模式和边偏移两部分,也就是说以后定位要和边偏移量搭配使用.边偏移加定位定位模式才能构成一个完整的定义方式. 偏移量说明: 边偏移属性 描述 top: 顶端偏移,定义元素相对 ...

  8. Spring7大模块

    Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式,组成 Spring 框架的每个模块(或组件)都可 ...

  9. Spring Cloud(二)服务提供者 Eureka + 服务消费者(rest + Ribbon)

    Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...

  10. vue打包dist文件时,图片找不到

    1.vue打包dist文件时,图片找不到,无法像在本地一样查看 问题描述: 本地代码:<div class="icon"><img :src="'../ ...