找性质的能力不行

Problem Statement

We have a sequence of $N$ integers: $x=(x_0,x_1,\cdots,x_{N−1})$. Initially, $x_i=0$ for each $i (0≤i≤N−1)$.

Snuke will perform the following operation exactly $M$ times:

Choose two distinct indices $i,j (0≤i,j≤N−1, i≠j)$. Then, replace $x_i$ with $x_i+2$ and $x_j$ with $x_j+1$.
Find the number of different sequences that can result after $M$ operations. Since it can be enormous, compute the count modulo $998244353$.

Constraints

  • $2≤N≤10^6$
  • $1≤M≤5×10^5$
  • All values in input are integers.

题目分析

这类题的一般套路是把一些奇奇怪怪的操作转化成局部量守恒;或者是操作对一些特殊量的影响有什么限制。

这里首先能够看出限制一:$\forall a_i \le 2m$.

再来考察一下操作有什么特性:在两个位置$i,j$分别加上$2,1$也就是把$j$的奇偶性翻转;$i$的奇偶性不影响。初始每个位置都为偶。这说明全部操作只有$m$次翻转奇偶性的机会,由此得到限制二:$\sum\limits [x_i为奇数]\le m$.

这两个限制的必要性上面已经论述了,充分性可以通过对$m$归纳得到。

现在问题变成了:

给定$n,m$,求长度为$n$的可空数列$\{x_i\}$满足$[\sum x_i=3m ]\and [\forall x_i \le 2m ]\and [\sum\limits [x_i为奇数]\le m]$的个数。

第一条限制很好处理,问题主要是第二条限制。

首先来考虑单纯满足第二条限制的数列个数,不妨记$f(n,m,k)$表示把$m$分为$n$组非空、且奇数个数$\le k$的方案数。那么这里有$f(n,3m,m)=\sum\limits _{p=1,p≡3m\pmod 2}^n {\frac{3m-p}{2}+n-1\choose n-1}{n \choose p}$,其中$p$是枚举的奇数个数。

容斥地考虑,现在要计算的另一部分问题应是$[\exists x_i > 2m ]\and [\sum\limits [x_i为奇数]\le m]$,也即:枚举最大数位置$pos$,把$m$分为$n$组非空、奇数个数$\le k$、且$x_{pos}$非空的方案数。

这里的“某一位置非空”就是很经典的问题了,可以先用$m-1$构造非空数列、再将$1$加到$x_{pos}$上;也可以再容斥一次,用$m$构造$n$的方案减去用$m$构造$n-1$的方案,意即此位置为零不占用$m$.

 #include<bits/stdc++.h>
#define MO 998244353
typedef long long ll;
const int maxn = ; ll n,m,ans;
ll inv[maxn],fac[maxn]; ll C(ll n, ll m)
{
if (n < m) return ;
return fac[n]*inv[m]%MO*inv[n-m]%MO;
}
ll f(ll n, ll m, ll k)
{
ll ret = ;
for (ll p=; p<=k; p++)
if (((m-p)&)==){
ret = (ret+C((m-p)/2ll+n-, n-)*C(n, p)%MO)%MO;
}
return ret;
}
int main()
{ scanf("%lld%lld",&n,&m);
fac[] = inv[] = inv[] = ;
for (int i=; i<=n+*m; i++)
inv[i] = (MO-1ll*MO/i*inv[MO%i]%MO);
for (int i=; i<=n+*m; i++)
inv[i] = inv[i-]*inv[i]%MO, fac[i] = fac[i-]*i%MO;
// ans = (f(n, 3*m, m)-n*(f(n, m, m)-f(n-1, m, m))%MO+MO)%MO;
ans = (f(n, *m, m)-n*(f(n, m-, m))%MO+MO)%MO;
printf("%lld\n",ans);
return ;
}

END

【组合数学】AGC036C - GP 2的更多相关文章

  1. AGC036C GP 2

    由于近期集训做的一直都是校内题 然后好久都怎么写题了( 发篇博客证明我还活着 (其实也没人关心 好像并不是很难的一道计数 就是脑子总是缺一块导致会做不出来( 首先我们可以分析性质 1.$\sum A_ ...

  2. AtCoder AGC036C GP 2 (组合计数)

    题目链接 https://atcoder.jp/contests/agc036/tasks/agc036_c 题解 终于有时间补agc036的题了. 这题其实不难的来着--我太菜了考场上没想出来 首先 ...

  3. 【atcoder】GP 2 [agc036C]

    题目传送门:https://atcoder.jp/contests/agc036/tasks/agc036_c 题目大意:给你一个长度为$N$初始全0的序列,每次操作你可以找两个不同的元素,一个自增1 ...

  4. ae GP制作缓冲区分析

    private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { // ...

  5. AE开发实现GP工具IDW

    IDW——空间插值 IDW(Inverse Distance Weighted)是一种常用而简便的空间插值方法,它以插值点与样本点间的距离为权重进行加权平均,离插值点越近的样本点赋予的权重越大. 设平 ...

  6. ArcGIS10.1 发布气温插值GP服务

    首先通过ModelBuilder 工具 构建模型 然后通过模块右键 设置输入参数 或者直接将一个模块设为输入参数 在输出模块的右键属性上 可以设置lyr文件用于渲染 设置数据添加到显示用于不是发布的时 ...

  7. AE调用GP工具的方法(转)

    第一,首先要明确自己需要调用arctoolbox里面的什么工具,实现什么样的功能. 第二,按照需求看看在arctoolbox工具中是怎么实现功能的,然后确定需要的数据源. 第三,编写command或t ...

  8. GP 环境参数名称列表

    Using environment settings In this topic About using environment settings Environment settings summa ...

  9. GP调用arctoolbox 以Clip为例

    GP的功能非常强大,也是GIS建模的一个很重要的工具.在Arcengine中,实现Clip功能很多种方法,可以用IBasicGeoprocessor的clip方法,但是GP无疑是最简单的. publi ...

随机推荐

  1. js 监听音频视频控件是否播放

    监听onplaying: var myVideo=document.getElementById("video1"); myVideo.addEventListener(" ...

  2. 洛谷 题解 P1220 【关路灯 】

    搜索 传参 inline void DFS(int now,int l,int r,int cnt,int sum,int k) /* now为当前点 l为左端点 r为右端点 cnt为当前耗电量 su ...

  3. [转帖]ubuntu 修改 apt源的方法

    https://www.cnblogs.com/dadonggg/p/11129973.html ubuntu 和 centos 是不一样的 ubunut 里面 用deb开头 放置到 /etc/apt ...

  4. 2019年9月(System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。)问题解决记录

    System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本. 在百度上寻找了很久,都说是权限的问题,可是更改过后一点效果也没有. 实际上真 ...

  5. mysql-事务总结

    目录 事务基本概念 事务的定义 使用事务 自动提交 特殊操作 ACID特性及其原理 原子性(A) 持久性 (D) 隔离性 脏读.不可重复读和幻读 事务隔离级别 mysql事务日志 redo log 定 ...

  6. java中讲讲DataInputStream的用法,举例?

    [学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...

  7. Java web server 基本实现原理

    public class WebServer { //服务端Socket只要一个,所以定义成static, 同一时间只能一个线程访问(主线程) private static ServerSocket ...

  8. Two progressions(CodeForces-125D)【鸽巢原理】

    题意:将一列数划分为两个等差数列. 思路:首先,我要吹爆鸽巢原理!!!真的很强大的东西!!! 加入能完成题设操作,则前三个数中,必有至少两个数在同一序列,枚举三种情况(a1 a2,a2 a3,a1 a ...

  9. MySQL 聚合函数与count()函数

    一.MySQL中的聚合函数 MySQL 5.7文档的章节:12.20.1 Aggregate (GROUP BY) Function “聚合/组合”函数(group (aggregate) funct ...

  10. 怎样通过name属性获取元素节点集合

    使用 document.getElementsByName(); document.getElementsByName("userInfo") instanceof NodeLis ...