CF838C-Future Failure【dp,子集卷积】

正题

题目链接:https://www.luogu.com.cn/problem/CF838C


题目大意

一个字符串sss,两个人轮流操作,每次每个人可以选择删掉一个字符或者重排列这个字符串,但是不能出现之前出现过的字符串,不能操作者输。

求有多少个长度为nnn且字符集大小为kkk的字符串使得先手必胜。

1≤n≤250000,1≤k≤261\leq n\leq 250000,1\leq k\leq 261n250000,1k26


解题思路

显然如果删掉一个字符能使得先手必败,那么先手必胜。如果不能,那么肯定会一直重排列这个字符串。

那么如果一个字符串的排列数是偶数,那么先手可以切换先后手,所以先手必胜。否则先手需要考虑能否删除一个字符使得先手必败。

设第iii个字符的数量是aia_iai,那么一个字符串可重排列的方案就是n!∏i=1kai!\frac{n!}{\prod_{i=1}^ka_i!}i=1kai!n!,并且如果删除一个字符iii,那么排列方式将会乘上ain\frac{a_i}{n}nai

那么如果nnn是奇数,肯定存在一个aia_iai是奇数,也就是说删除一个iii后排列方式的奇偶性不变。所以如果一个nnn是奇数且字符串的排列数是奇数,那么肯定可以删除一个字符使得排列数仍然是偶数。
那么如果nnn是奇数且先手,那么肯定不会被逼到一个走动后先手必胜的位置,所以nnn是奇数先手必胜。

然后如果nnn是偶数,那么如果排列方式是偶数那么先手必胜否则先手必败。

然后考虑怎么计数nnn是偶数的情况。考虑到一个n!n!n!包含的222质因数的个数为∑i=0⌊n2i⌋\sum_{i=0}\lfloor\frac{n}{2^i}\rfloori=02in,那么如果一个字符串的排列方式是偶数那么肯定有
∑i=0⌊n2i⌋=∑p=1k∑i=0⌊ap2i⌋\sum_{i=0}\left\lfloor\frac{n}{2^i}\right\rfloor=\sum_{p=1}^k\sum_{i=0}\left\lfloor\frac{a_p}{2^i}\right\rfloori=02in=p=1ki=02iap
然后又因为假设我们考虑一直分解xxx出来,显然∏i=1kai!\prod_{i=1}^ka_i!i=1kai!xxx肯定不会比n!n!n!xxx多,同理分解2k2^k2k出来也是一样的,所以它们每一个iii求出来的答案都是恰好相等的,即
∀i∈N,⌊n2i⌋=∑p=1k⌊ap2i⌋\forall i\in N,\left\lfloor\frac{n}{2^i}\right\rfloor=\sum_{p=1}^k\left\lfloor\frac{a_p}{2^i}\right\rflooriN,2in=p=1k2iap
那么aia_iai求和的时候二进制就不能有进位了,也就是说对于nnn中的每个111aia_iai都恰好有一个是111nnn中的每一个000aia_iai这一位都是000

也就是把nnn的二进制分成若干份aia_iai,每一份的贡献是1ai!\frac{1}{a_i!}ai!1,要求贡献的乘积和。这个分出一个部分来的转移其实就是子集卷积,所以我们跑kkk次子集卷积即可。

这样跑有点慢,所以我们还需要快速幂优化。

时间复杂度:O(klog⁡knlog⁡2n)O(k\log kn\log ^2n)O(klogknlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=1<<19;
int n,k,P,f[20][N],g[20][N],c[N],inv[N],fac[N];
void FWT(int *f,int n,int op){for(int p=2;p<=n;p<<=1)for(int k=0,len=p>>1;k<n;k+=p)for(int i=k;i<k+len;i++)(f[i+len]+=f[i]*op)%=P;return;
}
signed main()
{scanf("%d%d%d",&n,&k,&P);int ans=1;for(int i=1;i<=n;i++)ans=1ll*ans*k%P;fac[0]=inv[0]=inv[1]=1;for(int i=2;i<N;i++)inv[i]=P-1ll*inv[P%i]*(P/i)%P;for(int i=1;i<N;i++)fac[i]=1ll*fac[i-1]*i%P,inv[i]=1ll*inv[i-1]*inv[i]%P;if(n&1)return printf("%d\n",ans)&0;f[0][0]=1;int m=1,lg=0;while(m<=n)m<<=1,lg++;for(int i=1;i<m;i++)c[i]=c[i-lowbit(i)]+1;for(int i=0;i<=n;i++)g[c[i]][i]=inv[i];for(int i=0;i<c[n];i++)FWT(g[i],m,1);FWT(f[0],m,1);while(k){if(k&1){for(int i=c[n];i>=0;i--){for(int x=0;x<m;x++)f[i][x]=1ll*f[i][x]*g[0][x]%P;for(int j=1;j<=i;j++)for(int x=0;x<m;x++)f[i][x]=(f[i][x]+1ll*f[i-j][x]*g[j][x])%P;}}for(int i=c[n];i>=0;i--){for(int x=0;x<m;x++)g[i][x]=(i?2ll:1ll)*g[0][x]*g[i][x]%P;for(int j=1;j<i;j++)for(int x=0;x<m;x++)g[i][x]=(g[i][x]+1ll*g[j][x]*g[i-j][x])%P;}k>>=1;}FWT(f[c[n]],m,-1);ans=(ans-1ll*f[c[n]][n]*fac[n]%P)%P;printf("%d\n",(ans+P)%P);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Reactive Extensions 相见恨晚的Rx.Net

何为Reactive Extensions&#xff08;Rx&#xff09;Rx是一个遵循函数式编程的类库&#xff0c;它引用观察者以及迭代器设计模式对可观察对象产生的数据进行异步消费。使用Rx&#xff0c;开发人员将使用LINQ运算符操作异步数据流&#xff0c;并使用调度程序参数化异步数据流中的…

CF819E:Mister B and Flight to the Moon(构造、归纳法)

解析 本题也算看了一半题解吧 看到“数学归纳法”退出来自己推的 这题想到归纳法后面也就简单了 首先&#xff0c;n3和n4的时候显然有解&#xff0c;可以打表 然后考虑在获得n-2的答案时&#xff0c;如何获得n的答案 如果n为奇数&#xff0c;我们可以把(1,n-1,2,n)、(3,n-1,4…

AcWing 1303. 斐波那契前 n 项和

AcWing 1303. 斐波那契前 n 项和 题意: 题解&#xff1a; 这个题解分析的太到位了 代码&#xff1a; #include<iostream> #include<cstring>#define ll long longusing namespace std;const int N3;int n,m; ll f1[N][N]{{1,1,1}}; ll A[N][N]{{0,1,0},{1,1,1…

2021-4-4 省选模拟赛(灯,十字路口,密室逃脱)

文章目录考试复盘A&#xff1a;灯(light)B&#xff1a;十字路口(crossing)C&#xff1a;密室逃脱(escape)考试复盘 第一题分块虽然明显&#xff0c;但是说实话自己没怎么做过分块的题 就不会做大块的处理。。。(;_) 今天听H老说分块可以成替代数据结构的骗分暴力对拍神器 这么…

AGC056E-Cheese【dp】

前言 奶酪可能会长腿&#xff0c;但绝对不会变质 _ _&#xff0c;_ _ _ _ _ _ _ 正题 题目链接:https://atcoder.jp/contests/agc056/tasks/agc056_e 题目大意 有一个长度为nnn的环&#xff0c;第i0.5(0≤i<n)i0.5(0\leq i<n)i0.5(0≤i<n)位置上各有一只老鼠。 然…

张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用

什么是 GPIOGPIO 是 General Purpose Input Output 的缩写&#xff0c;即“通用输入输出”。 Raspberry Pi 有两行 GPIO 引脚&#xff0c; Raspberry Pi 通过这两行引脚进行一些硬件上的扩展&#xff0c;与传感器进行交互等等。Raspberry Pi B/2B/3B/3B/Zero 引脚图简单的讲&am…

acwing1304. 佳佳的斐波那契

1304. 佳佳的斐波那契 题意&#xff1a; S(n)表示Fibonacci的前n项和mod m T(n)(F12F23F3…nFn)mod m 给n和m&#xff0c;求T(n) 题解&#xff1a; 矩阵快速幂 参考题解 关键在于构造矩阵相乘的形式 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) pri…

CF1444C Team-Building(可持久化并查集)(二分图)

解析 容易想到补集思想&#xff0c;寻找那些组之间不能形成二分图 二分图一般的两个判定方法&#xff1a; 染色并查集 这里考虑并查集&#xff08;看题解似乎染色也可做&#xff09; 先把所有组内的边合并并查集 如果某个组自己内部就有奇环&#xff0c;显然不能和任何点配…

[2021.4.7多校省选模拟33]A,B,C

文章目录考试复盘ABC考试复盘 今天的题其实蛮温柔的 考完试预估分160160160&#xff0c;好家伙到手的只有14\frac{1}{4}41​ 第一题是原题&#xff0c;做过的&#xff0c;虽然忘记怎么做了。。。⊙︿⊙ 但是因为本身较简单&#xff0c;考场上也想到了正解 但是因为我的SBS…

C# 8 新提案让泛型 Attribute 成为现实

从一开始&#xff0c; Attribute 就是.NET 的一部分。因此&#xff0c;它们在引入泛型之前就已经被创建好&#xff0c;这意味着如果要引用属性中的类型&#xff0c;必须暴露一个 Type 参数或属性。例如&#xff1a;[TypeConverter(typeof(X))]这种模式存在一些限制。在上面的示…

P5044-[IOI2018] meetings 会议【dp,笛卡尔树,线段树二分】

正题 题目链接:https://www.luogu.com.cn/problem/P5044 题目大意 给出一个长度为nnn的序列hhh&#xff0c;定义dis(x,y)max{hi}(x≤i≤y)dis(x,y)max\{h_i\}(x\leq i\leq y)dis(x,y)max{hi​}(x≤i≤y)。 qqq次询问给出一个区间[L,R][L,R][L,R]&#xff0c;找到一个x∈[L,R]…

模板:线段树标记永久化

为了那不可知的询问永远坚守于此 解析 众所周知线段树的区间修改是需要打懒标记的 多数时候&#xff0c;这个标记在询问子区间时需要下传 而标记永久化&#xff0c;就是指不下传懒标记的一种操作 在某些时候标记不便下传时有所应用 比如zkw线段树和二维线段树等 然而zkw线段树…

1305. GT考试

1305. GT考试 题意&#xff1a; 准考证长度为n位&#xff0c;不吉利数字有m位&#xff0c;问不出现不吉利数字的准考证有多少种&#xff0c;答案mod K 题解&#xff1a; 动态规划kmp矩阵快速幂 设dp[i][j]表示长度为i&#xff0c;且不包含S串&#xff0c;且末尾部分与S串的…

.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

内容&#xff1a;本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证作者&#xff1a;zara(张子浩) 欢迎分享&#xff0c;但需在文章鲜明处留下原文地址。在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序&#xff08;需要有IdentityServe…

[CF/AT]各大网站网赛 体验部部长第一季度工作报告

文章目录CodeForces#712 (Div. 1)——1503A. Balance the BitsB. 3-ColoringC. Travelling Salesman ProblemD. Flip the Cards108 (Rated for Div. 2)——1519A. Red and Blue BeansB. The Cake Is a LieC. Berland RegionalD. Maximum Sum of ProductsE. Off by OneCodeforce…

G - Tiling FZU - 2040(未解决)

G - Tiling FZU - 2040 题意&#xff1a; m * n的矩阵&#xff0c;通过任意大小的矩阵&#xff0c;有多少种填充方式&#xff1f; 图片为3 * 2的矩阵有如下填充方式&#xff1a; 题解&#xff1a; 矩阵快速幂 目前还没参透 代码:

P7520-[省选联考 2021 A 卷]支配

正题 题目链接:https://www.luogu.com.cn/problem/P7520 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;一号点为起始点&#xff0c;qqq次独立的询问加入一条边后有多少个点的支配集发生了变化。 1≤n≤3000,1≤m≤2n,1≤q≤21041\leq n\leq 3000,1\leq m\leq 2\times…

11.16 模拟:总结

220pts 100100020 整体还可以&#xff0c;虽然T3挂掉了&#xff0c;但T1T2做出来还是不错的 问题&#xff1a; 开局审错了题&#xff01;T2调了太久T3写挂了白给了40… &#xff08;我临交前就觉得T3细节这么多很可能挂还检查了一遍&#xff09; 只能说我的直觉很灵敏了 这…

C# 8 的新提案:new 关键字类型推断

在很多情况下&#xff0c;一个地方只允许出现一种可能的类型。C# 仍然要求你明确列出类型&#xff0c;但如果目标类型“new”表达式提案被采用&#xff0c;那么就不再需要这些样板代码。从表面上看&#xff0c;这个特性看起来与 var 关键字恰好相反。它不是根据表达式推断出变量…

CF1540B Tree Array(期望,dp)

解析 关于合理的实现 这题卡在最后的小破dp是我没想到的 一开始看到200的数据范围就不禁笑出了声 lca直接On求&#xff01; 然后就开始大力分类讨论 然后就卡在了一个问题上 两个栈AB&#xff0c;分别有a和b个元素&#xff0c;随机从两个栈中弹出一个元素&#xff0c;求最后A栈…