[LOJ6671] EntropyIncreaser 与 Minecraft

前言

仅以此纪念我为数不多自己做出来的数学题。

当然这道题不难,不然我也做不出来。

其实就是想水博客。

题目

LibreOJ

讲解

直接暴力化式子就好了。

\(i\) 为威力,\(j\)\(x_i\) 不为\(0\),前面的 \(1\) 是全 \(0\) 的情况。

\(1+\sum_{i=1}^p\sum_{j=1}^nC(n,j)\times 2^j\times C(i-1,j-1)\)

\(1+\sum_{j=1}^{n}C(n,j)\times 2^j\times\sum_{i=1}^p C(i-1,j-1)\)

\(1+\sum_{j=1}^{n}C(n,j)\times 2^j\times C(p,j)\)

大概就是把 \(\sum\) 乱换位置,然后发现有些东西可以变换形式,从而使式子变得更简洁。

这就是推式子?

代码

人丑常数大
//12252024832524
#include <cstdio>
#include <cstring>
#include <algorithm>
#define TT template<typename T>
using namespace std; 

typedef long long LL;
const int MAXN = 1000005;
const int MOD = 1e9 + 7;
int n,p,ans = 1;

LL Read()
{
	LL x = 0,f = 1;char c = getchar();
	while(c > '9' || c < '0'){if(c == '-')f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
	return x * f;
}
TT void Put1(T x)
{
	if(x > 9) Put1(x/10);
	putchar(x%10^48);
}
TT void Put(T x,char c = -1)
{
	if(x < 0) putchar('-'),x = -x;
	Put1(x); if(c >= 0) putchar(c);
}
TT T Max(T x,T y){return x > y ? x : y;}
TT T Min(T x,T y){return x < y ? x : y;}
TT T Abs(T x){return x < 0 ? -x : x;}

int fac[MAXN],ifac[MAXN]; 
int qpow(int x,int y)
{
	int ret = 1;
	while(y){if(y&1) ret = 1ll * ret * x % MOD;x = 1ll * x * x % MOD;y >>= 1;}
	return ret; 
}
void init(int x)
{
	ifac[0] = fac[0] = 1;
	for(int i = 1;i <= x;++ i) fac[i] = 1ll * fac[i-1] * i % MOD;
	ifac[x] = qpow(fac[x],MOD-2);
	for(int i = x-1;i >= 1;-- i) ifac[i] = 1ll * ifac[i+1] * (i+1) % MOD;
} 
LL C(int x,int y)
{
	if(x < y || y < 0) return 0;
	return 1ll * fac[x] * ifac[y] % MOD * ifac[x-y] % MOD;
}
int Add(int x){if(x >= MOD) x -= MOD;return x;}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read(); p = Read();
	init(Max(n,p));
	for(int i = 1,mi = 2;i <= n;++ i) ans = (ans + C(n,i) * mi % MOD * C(p,i)) % MOD,mi = Add(mi << 1);
	Put(ans);
	return 0;
}
posted @ 2021-07-28 20:30  皮皮刘  阅读(63)  评论(0编辑  收藏  举报