Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】

正题

题目链接:https://loj.ac/p/6503


题目大意

nnn张卡mmm种,第iii种卡有aia_iai张,求所有排列中有kkk对相邻且相同的卡牌。

1≤n≤105,0≤k≤105,1≤m≤20000,∑i=1mai=n1\leq n\leq 10^5,0\leq k\leq 10^5,1\leq m\leq 20000,\sum_{i=1}^ma_i=n1n105,0k105,1m20000,i=1mai=n


解题思路

kkk对相邻的相同,就是可以分成有n−kn-knk组相同的。

考虑这个问题,把每组牌分成若干组插到不同位置,先不考虑这样可能插到相邻位置的情况我们后面可以再用容斥消掉。

那么对于一个aaa,分成iii组的方案就是(a−1i−1)\binom{a-1}{i-1}(i1a1),因为排列,列出生成函数∑i=1a(a−1i−1)xii!\sum_{i=1}^a\binom{a-1}{i-1}\frac{x^i}{i!}i=1a(i1a1)i!xi

然后用分治NTTNTTNTT乘起来,最后第iii项乘上一个i!i!i!就是方案了。

然后考虑容斥,枚举一个i≤n−ki\leq n-kink然后相当于至少有kkk对相邻,现在要减去更多的,所以容斥系数就是(−1)n−k−i(n−ik)(-1)^{n-k-i}\binom{n-i}{k}(1)nki(kni)

时间复杂度O(nlog⁡nlog⁡m)O(n\log n\log m)O(nlognlogm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,T=19,P=998244353;
struct Poly{ll a[N<<2],n;
}F[T+1];bool v[T+1];
ll m,n,k,w[N],inv[N],fac[N],r[N],x[N],y[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[i+len]%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return;
}
void Mul(Poly &F,Poly &G){ll n=1;while(n<F.n+G.n-1)n<<=1;for(ll i=0;i<F.n;i++)x[i]=F.a[i];for(ll i=0;i<G.n;i++)y[i]=G.a[i];for(ll i=F.n;i<n;i++)x[i]=0;for(ll i=G.n;i<n;i++)y[i]=0;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);NTT(x,n,1);NTT(y,n,1);for(ll i=0;i<n;i++)x[i]=x[i]*y[i]%P;NTT(x,n,-1);for(ll i=0;i<n;i++)F.a[i]=x[i];F.n=F.n+G.n-1;return;
}
ll FindA(){for(ll i=0;i<T;i++)if(!v[i]){v[i]=1;return i;}
}
ll C(ll n,ll m)
{return fac[n]*inv[m]%P*inv[n-m]%P;}
ll NTT(ll l,ll r){if(l==r){ll x=FindA();for(ll i=1;i<=w[l];i++)F[x].a[i]=inv[i]*C(w[l]-1,i-1)%P;F[x].n=w[l]+1;return x;}ll mid=(l+r)>>1;ll ls=NTT(l,mid),rs=NTT(mid+1,r);Mul(F[ls],F[rs]);v[rs]=0;return ls;
}
signed main()
{scanf("%lld%lld%lld",&m,&n,&k);inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;fac[0]=inv[0]=1;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;for(ll i=1;i<=m;i++)scanf("%lld",&w[i]);ll p=NTT(1,m),ans=0;for(ll i=n-k,f=1;i>=m;i--,f=-f)ans=(ans+f*F[p].a[i]*fac[i]%P*C(n-i,k)%P)%P;printf("%lld\n",(ans+P)%P);return 0;
}

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

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

相关文章

连通性(相关练习)

文章目录NC20603 [ZJOI2007]最大半连通子图题目&#xff1a;题解&#xff1a;代码&#xff1a;NC50403 嗅探器题目&#xff1a;题解&#xff1a;代码&#xff1a;NC51269 Network of Schools题目&#xff1a;题解&#xff1a;代码&#xff1a;NC106972 Cow Ski Area题目&#x…

ASP.NET Core WebAPI中使用JWT Bearer认证和授权

为什么是 JWT BearerASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer, OAuth, OpenIdConnect 等,Cookie 认证是一种比较常用本地认证方式, 它由浏览器自动保存并在发送请求时自动附加到请求头中, 更适用于 MVC 等纯网页系统的…

判断溢出(ybtoj-字符串)

文章目录题目描述输入格式输出格式样例输入样例输出数据范围解析注意代码题目描述 我们将给你一些数和一个数据类型&#xff0c;你需要判断&#xff0c;如果将这些数连续相乘起来&#xff0c;将会在第几个数出现溢出的情况。 输入格式 多组数据。 第一行只有一个整数&#x…

2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)

前言 依旧是白嫖账号&#xff0c;只打了一些题/kk 正题 1002 Buying Snacks 题目大意 nnn个物品&#xff0c;每个可以买一次也可以不买&#xff0c;如果买需要选择1/21/21/2块钱的&#xff0c;然后也可以相邻两个一起买并且减少一块的花销&#xff0c;求恰好用掉mmm块钱的方案…

分羊(区间dp:分治与决策单调性优化)

文章目录题目描述样例输入样例输出解析代码题目描述 给你一个数列&#xff0c;分成m段&#xff0c;每段的价值为相同数对的对数 求最小价值和 样例输入 10 2 1 2 1 2 1 2 1 2 1 2 样例输出 8 解析 容易想到区间dp 定义dp[i][j]:把前i个数分成j段的最小价值 那么枚举最后一段…

网络流专题(最大流与费用流)(一)

流量网络 • 想要将一些水从S运到T&#xff0c;必须经过一些水站&#xff0c;链接水站的是管道&#xff0c;每条管道都有它的最大能容纳的水量&#xff0c;求最多S到T能流多少流量。 基本概念 • 这是一个典型的网络流模型。我们先了解网络流的有关定义和概念。 • 若有向图G(…

eShopOnContainers 看微服务 ①:总体概览

一、简介eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用。该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用。其包含基于浏览器的Web应用、基于Xamarin的Android、IOS、Windows/UWP 移动应用&#xff0c;以及服务端应…

【模板】文艺平衡树

题目链接 题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 543215\ 4\ 3\ 2\ 15 4 3 2 1&#xff0c;翻转区间是 [2,4][2,4][2,4] 的话&a…

P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串。 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超过90%90\%90%的部分拿出来分后每个串都是某个模板串的子串且长度不小于LLL。 所有输入文件长度不超过 110000011000001…

猜数(二分、线段树)

题目描述 对于一个长度为n的数列给出m个描述 每一个描述给出一个区间[a,b]的最小值的x 求从第几个描述开始矛盾 解析 本题关键是一个关于矛盾的充要条件&#xff1a; 如果存在一个最小值x&#xff0c;其所在的区间的交集&#xff08;就是它真正可以存在的区间&#xff09;是…

网络流专题(最大流与费用流)例题总结

文章目录NC 106056 poj1459 Power Network题目大意&#xff1a;题解&#xff1a;NC213817 [网络流24题]最小路径覆盖问题题目&#xff1a;题解&#xff1a;例2&#xff1a;NC213818 [网络流24题]魔术球问题题目&#xff1a;题解&#xff1a;方法2&#xff1a;NC 213820 [网络流…

FHQ Treap

FHQ Treap 主要通过 merge⁡\operatorname{merge}merge 和 spilt⁡\operatorname{spilt}spilt 两个核心操作和其他辅助函数来实现。 本文用 lcxlc_xlcx​ 表示 xxx 的左儿子&#xff0c;rcxrc_xrcx​ 表示 xxx 的右儿子&#xff0c;datxdat_xdatx​ 表示 xxx 的随机优先级 me…

从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线

从发现.NET Framework中SmtpClient的Bug并拿出解决方案&#xff0c;然后给微软开发者社区提交Bug开始&#xff0c;总共耗时一个多月&#xff0c;对Bug修复的代码最终被采纳&#xff0c;现已合并到.NET Core Libraries (CoreFX)主线中。修复记录https://github.com/dotnet/coref…

P2469-[SDOI2010]星际竞速【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P2469 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;你每次可以选择一条s−>ts->ts−>t的路径花费AsA_sAs​的代价出发&#xff0c;而且只能从编号小的点到编号大的点走&#xff0c;求最小花费使得所有点被…

周期长度和(KMP)

文章目录题目描述解析问题总结代码题目描述 解析 我们可以看到 如果A是B的周期 那么B一定可以写成&#xff1a; A1A2A1 的形式 注意到&#xff1a;A1就是KMP中的公共前后缀 要使A最大&#xff0c;要使A1最短 也就是求最短公共前后缀 这怎么求呢&#xff1f; 我们注意到&#x…

计算几何基础-1

文章目录基本概念点与向量的运算精度问题线段&#xff0c;射线和直线点积&#xff1a;夹角叉积向量的极角旋转一个向量求三角形面积直线交点点到直线距离点在直线上的投影判断两条线段是否相交点与直线的位置关系点是否在直线左侧点是否在直线上点是否在线段上点与多边形的位置…

.net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

目录1.pod管理2.重启策略3.健康检查4.进入容器正文上一章我们已经通过yaml文件将.netcore程序跑起来了&#xff0c;但还有一下细节问题可以分享给大家。1.pod管理1.1创建podkubectl create -f netcore-pod.yaml我们创建一个netcore-pod.yaml文件&#xff0c;内容如下&#xff1…

【模板】可持久化并查集

题目链接 题目描述 给定 nnn 个集合&#xff0c;第 iii 个集合内初始状态下只有一个数&#xff0c;为 iii。 有 mmm 次操作。操作分为 333 种&#xff1a; 1 a b 合并 a,ba,ba,b 所在集合&#xff1b; 2 k 回到第 kkk 次操作&#xff08;执行三种操作中的任意一种都记为一次…

P1758-[NOI2009]管道取珠【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为nnn和一个大小为mmm的栈&#xff0c;每次选择一个栈弹出栈顶然后记录这个字母&#xff0c;求所有弹出序列的弹出方案的二次方和。 1≤n,m≤5001\leq n,m\leq 5001≤n,m≤500 解题思路 二次方和…

洛谷P2680:运输计划(倍增、二分、树上差分)

传送门 文章目录题目描述解析问题代码题目描述 解析 求最大值的最小值 容易想到二分 然后。。。就没有然后了。。。 看了题解 学会了一个新技能&#xff1a;树上差分 &#xff08;其实学长之前好像讲过。。。&#xff09; 一般的&#xff0c;对于一条A到B的路径&#xff0c;如…