咕咕机app官网_咕咕小哨

咕咕机app官网_咕咕小哨P4996 咕咕咕

大家好,又见面了,我是你们的朋友全栈君。

贡献法+组合数学

讲道理一看到辣么小的\(n\),我就想到了状压dp。

枚举子集?哦,\(O(3^n)\)的复杂度。但是我没有注意到\(n=20\)的时候是过不了的。

接下来我就在想70pts的状压dp要怎么写?

没有清楚定义状态的我连样例2都过不了,只能够手动枚举拿30pts。

所以最简单的月赛也爆炸了


70pts的状压

下面的做法是借鉴luogu题解的,不是抄袭。(你信吗?)

dp[i]表示从全0转移到i状态的所有歉意值之和。

那么会有

\[dp[i]=\sum{dp[j] + qy[j] \times num[j]}, j \in i and j \neq \emptyset\]

其中num[j]表示从全0转移到j的方案数,qy[j]表示当前这个状态的歉意值。

num[j]自然也是可以递推的,可以这么递推:

\[num[j] = \sum{num[k]}, k \in j and k \neq \emptyset\]

用枚举子集的优化技巧就可以做到\(O(3^n)\)的搞出来了。

不给代码,题解里面是有的。

我的错误之处:没有意识到方案数是对答案有影响的。

满分做法

使用贡献法,那么每一个歉意值就会对答案产生贡献了。

产生的贡献是多少?是这个状态在所有方案中出现的次数 乘以 这个方案的歉意值。

还能够发现:其实一个状态只跟它的01个数有关,跟她们的顺序是无关的。

所以设一个\(num[i]\)表示填\(i\)个1的方案数,那么就可以递推出来了。

递推式是这样子的:

\[num[i] = \sum_{j=1}^n{num[i-j] \times C_i^j}\]

那么最后的答案就是该方案0的个数 乘以 该方案1的个数 乘以 这个方案的歉意值。

对了:注意取膜!否则你就只有80pts啦。

代码:

#include<cstdio> #include<cstring> #define ll long long const int maxn = 21, maxN = 1048580; const int MOD = 998244353; ll dp[maxN]; ll qy[maxN]; ll num[maxn]; ll C[maxn][maxn]; int n, m; void init() { for(int i = 0; i <= 20; i++) { C[i][0] = C[i][i] = 1; } for(int i = 1; i <= 20; i++) { for(int j = 1; j < i; j++) { C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD; } } } int popcount(char *ch) { int len = strlen(ch); int res = 0; for(int i = len - 1; i >= 0; i--) { if(ch[i] == '1') res++; } return res; } int main() { init(); scanf("%d%d", &n, &m); num[0] = 1; for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++) { num[i] = (num[i] + C[i][i - j] * num[i - j] % MOD) % MOD; } } ll ans = 0; for(int i = 1; i <= m; i++) { char ch[25]; int x; scanf("%s%d", ch, &x); int temp = popcount(ch), len = strlen(ch); ans = (ans + x * num[temp] % MOD * num[len - temp] % MOD) % MOD; } printf("%lld\n", ans); return 0; }

转载于:https://www.cnblogs.com/Garen-Wang/p/9913101.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107210.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月20日 下午10:00
下一篇 2022年4月20日 下午10:00


相关推荐

  • Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)

    Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)导语”慢品人间烟火色闲观人间岁月长”———致自己​​​​????遇见我以后,我们的故事就开始了,愿你历经山河,仍觉得人间值得????。​星光月夜烟花皆归你,我也归你。关于烟花????大家都​知道多少?有多少表白故事情节都发生在烟花下,想必木木子????不用说大家也知道叭~​​今天这则小短文就是关于烟花的故事!你准备好跟我一起进入烟花的世界了嘛?​正文“每一句文案,都有一个故事,你仔细听”​1)环境安装????准备好:.

    2022年6月2日
    40
  • CGLIB代理使用与原理详解

    CGLIB代理使用与原理详解JDK中提供的生成动态代理类的机制有个鲜明的特点是:某个类必须有实现的接口,而生成的代理类也只能代理某个类接口定义的方法。那么如果一个类没有实现接口怎么办呢?这就有CGLIB的诞生了,前面说的JDK的动态代理的实现方式是实现相关的接口成为接口的实现类,那么我们自然可以想到用继承的方式实现相关的代理类。【1】CGLIB简单实现①pom依赖如下&amp;amp;amp;amp;amp;amp;amp;lt;!–https://…

    2022年5月22日
    74
  • Linux被kdevtmpfsi 挖矿病毒入侵[通俗易懂]

    Linux被kdevtmpfsi 挖矿病毒入侵[通俗易懂]Linux被kdevtmpfsi挖矿病毒入侵一.错误信息二.解决问题1.首先停掉kdevtmpfsi的程序2.删除Linux下的异常定时任务3.结束kdevtmpfsi进程及端口占用4.删除掉kdevtmpfsi的相关文件一.错误信息先上阿里云上的报警信息。有个最大的问题是:top命令查看自己服务器CPU运行情况,会发现kdevtmpfsi的进程,CPU使用率为100%,第一次删除干净了k…

    2022年5月30日
    39
  • AndroidStudio gradle配置

    AndroidStudio gradle配置AndroidStudi 配置转载自 https www cnblogs com wxishang1991 p 5457878 html 注 若选中 Usedefaultgr recommended 则设置的 Gradle 位置为 Servicedirec 中的路径 若选中 Uselocalgrad

    2025年11月26日
    9
  • 灰度测试

    灰度测试灰度测试是什么意思呢 如果对互联网软件研发行业不太了解的话 可能对这个词还是很陌生的 其实灰度测试就是指如果软件要在不久的将来推出一个全新的功能 或者做一次比较重大的改版的话 要先进行一个小范围的尝试工作 然后再慢慢放量 直到这个全新的功能覆盖到所有的系统用户 也就是说在新功能上线的黑白之间有一个灰 所以这种方法也通常被称为灰度测试 从目前来看 灰度测试存在两种方式 一种是软件系统内自带灰

    2026年3月19日
    2
  • Java数组

    Java数组12.Java数组一、什么是数组数组可以理解成一个包含相同类型的有序数字集合也称储存一组数据的空间数组属于引用数据类型int[]a={1,2,3,4,5};集合内的数据称为元素

    2022年7月4日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号