LOJ6671 EntropyIncreaser 与 Minecraft (生成函数)
题面
EntropyIncreaser 是组合计数大师。
EntropyIncreaser 很喜欢玩麦块。当然,EntropyIncreaser 拥有非同常人的超能力,他玩的是MOD版的 n 维麦块,换成数学语言也就是
Z
n
\mathbb{Z}^n
Zn 空间。他现在手里有一个特制的
T
N
T
\tt TNT
TNT方块:若将它放在
(
x
1
,
x
2
,
…
,
x
n
)
(x_1,x_2,…,x_n)
(x1,x2,…,xn)(注意
x
i
x_i
xi 可能为负数)处,它将拥有
∑
i
=
1
n
∣
x
i
∣
∑_{i=1}^n|x_i|
∑i=1n∣xi∣ 的威力值。EntropyIncreaser 只是想看看这种特制
T
N
T
\tt TNT
TNT的爆炸场面,他并不希望对其他东西造成太大的损害,所以这个
T
N
T
\tt TNT
TNT方块的威力值必须
⩽
p
⩽p
⩽p 。
EntropyIncreaser 想请你告诉他,一共有多少不同的位置放置
T
N
T
\tt TNT
TNT,使其满足他的要求。答案对
1
0
9
+
7
10^9+7
109+7 取模。
EntropyIncreaser 想了一秒就知道了答案。但他决定还是考考你。
Sample Input
3 5
Sample Output
231
题解
决定了!就用生成函数表达对这道题的尊敬!
其实这道题是可以当作生成函数入门训练题的。
我们对每一维坐标的绝对值进行考虑,若
∣
x
i
∣
≠
0
|x_i|\not=0
∣xi∣=0 那么有正负两种情况,贡献为 2,若为 0,则只有一种情况,贡献为 1 。
因此,单个维度贡献的生成函数就是
f
(
x
)
=
1
+
2
x
+
2
x
2
+
.
.
.
=
2
x
−
1
−
1
f(x)=1+2x+2x^2+...=\frac{2}{x-1}-1
f(x)=1+2x+2x2+...=x−12−1
继续推下去吧! 我们可以得到总答案关于威力值的生成函数
F
(
x
)
=
f
n
(
x
)
=
(
2
x
−
1
−
1
)
n
F(x)=f^n(x)=\left(\frac{2}{x-1}-1\right)^n
F(x)=fn(x)=(x−12−1)n
用二项式定理:
F
(
x
)
=
(
2
x
−
1
−
1
)
n
=
∑
i
=
0
n
(
1
x
−
1
)
i
2
i
(
−
1
)
n
−
i
C
(
n
,
i
)
=
∑
i
=
0
n
(
1
+
x
+
x
2
+
.
.
.
)
i
2
i
(
−
1
)
n
−
i
C
(
n
,
i
)
F(x)=\left(\frac{2}{x-1}-1\right)^n=\sum_{i=0}^{n}\left(\frac{1}{x-1}\right)^i2^i(-1)^{n-i}C(n,i)\\ =\sum_{i=0}^{n}(1+x+x^2+...)^i2^i(-1)^{n-i}C(n,i)
F(x)=(x−12−1)n=i=0∑n(x−11)i2i(−1)n−iC(n,i)=i=0∑n(1+x+x2+...)i2i(−1)n−iC(n,i)
那么用隔板法可以得出,它的第
q
q
q 项就是
[
[
q
]
]
f
(
x
)
n
=
∑
i
=
0
n
C
(
q
+
i
−
1
,
i
−
1
)
2
i
(
−
1
)
n
−
i
C
(
n
,
i
)
[[q]]f(x)^n=\sum_{i=0}^{n}C(q+i-1,i-1)2^i(-1)^{n-i}C(n,i)
[[q]]f(x)n=i=0∑nC(q+i−1,i−1)2i(−1)n−iC(n,i)
我们要找的答案即
∑
q
=
0
p
[
[
q
]
]
f
(
x
)
n
=
∑
i
=
0
n
(
∑
q
=
0
p
C
(
q
+
i
−
1
,
i
−
1
)
)
2
i
(
−
1
)
n
−
i
C
(
n
,
i
)
=
∑
i
=
0
n
C
(
p
+
i
,
i
)
2
i
(
−
1
)
n
−
i
C
(
n
,
i
)
\sum_{q=0}^{p}[[q]]f(x)^n=\sum_{i=0}^{n}\left(\sum_{q=0}^{p}C(q+i-1,i-1)\right)2^i(-1)^{n-i}C(n,i)\\ =\sum_{i=0}^{n}C(p+i,i)2^i(-1)^{n-i}C(n,i)
q=0∑p[[q]]f(x)n=i=0∑n(q=0∑pC(q+i−1,i−1))2i(−1)n−iC(n,i)=i=0∑nC(p+i,i)2i(−1)n−iC(n,i)
成了!接下来只需要预处理阶乘求组合数,时间复杂度
O
(
n
)
O(n)
O(n) 。
CODE
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 3000005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
const int MOD = 1000000007;
int n,m,i,j,s,o,k;
int fac[MAXN],inv[MAXN],invf[MAXN];
int qkpow(int a,int b) {
int res = 1;
while(b > 0) {
if(b & 1) res = res *1ll* a % MOD;
a = a *1ll* a % MOD; b >>= 1;
}return res;
}
int C(int n,int m) {
if(m < 0 || m > n) return 0;
return fac[n] *1ll* invf[n-m] % MOD *1ll* invf[m] % MOD;
}
int main() {
fac[0]=fac[1]=inv[0]=inv[1]=invf[0]=invf[1]=1;
for(int i = 2;i <= 3000000;i ++) {
fac[i] = fac[i-1]*1ll*i % MOD;
inv[i] = (MOD-inv[MOD%i]) *1ll* (MOD/i) % MOD;
invf[i] = invf[i-1] *1ll* inv[i] % MOD;
}
n = read();m = read();
int ans = 0,po2 = 1;
for(int i = 0;i <= n;i ++) {
(ans += C(m+i,i)*1ll*po2 % MOD * (((n-i)&1) ? (MOD-1ll):1ll) % MOD *1ll* C(n,i) % MOD) %= MOD;
(po2 += po2) %= MOD;
}
printf("%d\n",ans);
return 0;
}
LOJ6671 EntropyIncreaser 与 Minecraft (生成函数)的更多相关文章
- 【LOJ6671】EntropyIncreaser 与 Minecraft
Orz lbt Description https://loj.ac/problem/6671 Solution
- hdu 5279 YJC plays Minecraft——生成函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅲ
第三波,走起~~ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ 单位根反演 今天打多校时 1002 被卡科技了 ...
- MineCraft note
客户端:http://pan.baidu.com/s/1hqgS8sshttp://pan.baidu.com/s/1mgmkduC 材质包:R3D小地图MODCraftGuide mod 内置合成表 ...
- [CodeForces - 712D]Memory and Scores (DP 或者 生成函数)
题目大意: 两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高. ( ...
- Ubuntu上安装Minecraft服务器
Minecraft由于其独特的魅力吸引了很多玩家.不过游戏的乐趣只有在和朋友一起玩的时候才最有意思,所以很早以前我就想建设自己的服务器.但由于专业知识欠缺,没有实现. 最近接触了Linux服务器,所以 ...
- HDU 1171 Big Event in HDU --暴力+生成函数
题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方 ...
- HDU 2189 悼念512汶川大地震遇难同胞――来生一起走 --生成函数
这题跟上两题也差不多. 把150以内的素数找出来,把素数的值看做硬币的面值,每个硬币的个数即ceil(150/prime[i]),因为再多也没用,最多组成n=150就行了,所以又回到了找硬币问题.用生 ...
- HDU 1085 Holding Bin-Laden Captive --生成函数第一题
生成函数题. 题意:有币值1,2,5的硬币若干,问你最小的不能组成的币值为多少. 解法:写出生成函数: 然后求每项的系数即可. 因为三种硬币最多1000枚,1*1000+2*1000+5*1000=8 ...
随机推荐
- Wget命令解释
Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...
- 李呈祥:bilibili在湖仓一体查询加速上的实践与探索
导读: 本文主要介绍哔哩哔哩在数据湖与数据仓库一体架构下,探索查询加速以及索引增强的一些实践.主要内容包括: 什么是湖仓一体架构 哔哩哔哩目前的湖仓一体架构 湖仓一体架构下,数据的排序组织优化 湖仓一 ...
- 解决maven依赖冲突,这篇就够了!
一.前言 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突. 依赖冲突的原因 我们在maven项目的pom中 一般会引用许许多多的dependency.例如 ...
- 理论+案例,带你掌握Angular依赖注入模式的应用
摘要:介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题. 本文分享自 ...
- SAP APO-主数据设置
可以在SAP APO的相关组件中创建主数据,也可以将其从SAP R / 3传输到SAP APO. 可以使用核心接口(CIF)将其传输到SAP APO模块. 在主数据集成模型中,您定义将主数据传输到SA ...
- 《Domain Agnostic Learning with Disentangled Representations》ICML 2019
这篇文章是ICML 2019上一篇做域适应的文章,无监督域适应研究的问题是如何把源域上训练的模型结合无lable的目标域数据使得该模型在目标域上有良好的表现.之前的研究都有个假设,就是数据来自哪个域是 ...
- UI自动化测试执行问题总结
------------恢复内容开始------------ ![image](https://img2022.cnblogs.com/blog/1510476/202206/1510476-2022 ...
- Tapdata 实时数据融合平台解决方案(三):数据中台的技术需求
作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区 首席架构师,极客时间MongoDB视频课程讲师. 我们讲完了这个中台的一个架构和它的逻 ...
- CSS 盒子模型(一)
CSS 盒子模型(一) 本人在校学生,主学后端,后来发现前端的基础都忘得差不多了才想着写文章回来复习!欢迎留言交流. 什么是盒子呢? 拿下举例,我们可以把每个红框都比作一个盒子,他们可以是任意的 HT ...
- Aborted wiping of zfs_member.1 existing signature left on the device.Aborting pvcreate on /dev/sda
看意思是有什么签名在上面,创建不了逻辑卷,确认数据备份的情况下执行对应的下面命令: wipefs --all --force /dev/sdax