题目传送门:https://atcoder.jp/contests/agc036/tasks/agc036_c

  题目大意:给你一个长度为$N$初始全0的序列,每次操作你可以找两个不同的元素,一个自增1,一个自增2,问$M$次操作后,能出现多少种不同的序列。

  这道题比赛时分析的时候漏条件了,导致最后一个样例一直过不去,不过考虑上漏掉的条件分析起来也是比较复杂的。

  我们可以发现如果一个序列$a$是合法的,当且仅当它满足以下条件:

    1. $\sum_{i=1}^{N} a_i=3M$。

    2. 整个序列里至多有$M$个奇数。

    3. $\max_{i=1}^{N} a_i<=2M$。

  证明可以考虑对$M$数学归纳。

  我们可以先忽略条件3,枚举奇数的个数$i$,那么就是相当于对于一个全是偶数的数列,选择$i$个加上1,总方案数为$\sum_{i=1}^{\min(N,M)}\binom{N}{i}\binom{N-1+3M-i}{N-1}$,可以在$O(n+m)$的时间复杂度下计算。

  然后在考虑减去不满足条件3的方案数。由于序列中大于$2M$的元素最多只有一个,因此我们可以钦定那个大于$2M$的元素为$a_1$,并将其减去$2M$,这样操作后的序列,并且原序列如果满足原序列是满足条件1,2,不满足条件3,当且仅当操作后的序列满足以下条件:

    a. $\sum_{i=1}^{N} a_i=3M$。

    b. 整个序列至多有$M$个奇数。(减去$2M$不改变奇偶性)

    c. $a_1>0$。

  我们再把这些方案看作两部分相减:忽略条件c的方案减去考虑条件c非法的答案,而我们发现这样的忽略条件c的方案条件与上面的条件1,2相似,可以用相似方法统计,而考虑条件c时因为钦定$a_1=0$,所以直接序列整体平移,$N$自减1再统计即可。

  代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define mod 998244353
#define Mod1(x) (x>=mod?x-mod:x)
#define Mod2(x) (x<0?x+mod:x)
#define maxn 3000010
inline ll read()
{
ll x=; char c=getchar(),f=;
for(;c<''||''<c;c=getchar())if(c=='-')f=-;
for(;''<=c&&c<='';c=getchar())x=x*+c-'';
return x*f;
}
inline void write(ll x)
{
static int buf[],len; len=;
if(x<)x=-x,putchar('-');
for(;x;x/=)buf[len++]=x%;
if(!len)putchar('');
else while(len)putchar(buf[--len]+'');
}
inline void writeln(ll x){write(x); putchar('\n');}
inline void writesp(ll x){write(x); putchar(' ');}
ll fac[maxn],inv[maxn];
int n,m;
inline ll power(ll a,ll b)
{
ll ans=;
for(;b;b>>=,a=a*a%mod)
if(b&)ans=ans*a%mod;
return ans;
}
inline ll C(int n,int m){return fac[n]*inv[m]%mod*inv[n-m]%mod;}
inline ll calc(int n,int m,int k)
{
ll sum=;
for(int i=;i<=n&&i<=k;i++)
if(!((m-i)&)&&m>=i)sum=(sum+C(n,i)*C((m-i)/+n-,n-))%mod;
// writeln(sum);
return sum;
}
int main()
{
n=read(); m=read();
fac[]=inv[]=;
for(int i=;i<=n+*m;i++){
fac[i]=fac[i-]*i%mod;
inv[i]=power(fac[i],mod-);
}
ll ans=(calc(n,*m,m)-n*(calc(n,m,m)-calc(n-,m,m)+mod))%mod;
writeln(Mod2(ans));
return ;
}

agc036C

最新文章

  1. 箭头函数 Arrow Functions/////////////////////zzz
  2. django_cms安装技巧
  3. CodeIgniter2.2.0-在控制器里调用load失败报错的问题
  4. web服务器页面错误代码集
  5. 洛谷P3367 【模板】并查集
  6. Cache&amp;Session Viewer
  7. ABAP程序中退出操作(CHECK, EXIT, RETURN, LEAVE PROGRAM)
  8. Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG]
  9. C++ streambuf用法
  10. 在Struts2中使用poi进行excel操作下载的时候报getOutputStream() has already been called for this response 错误 [转]
  11. 6种炫酷的CSS3按钮边框动画特效
  12. &#127827;JavaScript 对象原型链继承的弊端 &#127827;
  13. Vnpy官网汇总
  14. Python3爬虫系列:理论+实验+爬取妹子图实战
  15. npm包
  16. day5 用户交互 input用法
  17. 温故而知新--JavaScript书摘(一)
  18. 【代码笔记】iOS-JASidePanelsDemo(侧滑)
  19. python面向对象(类和对象及三大特性)
  20. 卸载oracle11g步骤图解

热门文章

  1. ME21N屏幕格式配置路径
  2. Anaconda+tensorflow(不用创建虚拟环境)
  3. ArcMap 制作广州 18 级地图切片需要多少时间?
  4. centOS7下的静态Ip的配置。
  5. whereis which type find
  6. C++结构体基础知识
  7. Fastjson反序列化漏洞
  8. 亿级mongodb数据迁移
  9. Ubuntu14.04LTS下 JAVA+HADOOP
  10. linux安装mysql(yum)