首页 > 其他分享 >ICPC2020 Shanghai R E题

ICPC2020 Shanghai R E题

时间:2023-11-06 20:00:11浏览次数:32  
标签:ICPC2020 ifac Shanghai 个数 最小 ret using mod

传送门

description

给定 \(n,k\),求有多少个 \(n\) 的排列满足 \(\forall i\in[k+1,n],\min\limits_{j=i-k}^{i-1} a_j < a_i\)。

  • \(n,k\leq 10^7\)

solution

设 \(f_i\) 表示对于给定的 \(k\),排列长度为 \(i\) 时的答案。

转移时,我们考虑在头部添加新的数,设添加后的序列是 \(\{a\}\)。根据限制,我们只需考虑新加的数能不能使 \(a_{k+1}\) 大于它前面最小的数。

我们再来考虑一个性质:对于一个合法的排列,排列中的最小数一定在前 \(k\) 个数中。

于是,讨论 \(a_{k+1}\) 是否等于第 \(2\) 到第 \(i\) 个数的最小数。

  • 如果是,那么只有 \(a_1\) 也就是新添加的数为当前整个序列的最小数时才合法。此时第 \(2\) 到第 \(k\) 个数可以填除整个序列最小次小外任意的数。方案数就可以从 \(f_{i-k-1}\) 乘上系数转移过来了。

  • 否则,那么后面 \(i-1\) 个数的最小数一定在第 \(2\) 到第 \(k\) 个位置,方案数就是 \(f_{i-1}\) 减去后 \(i-1\) 个数的最小数在第 \(k+1\) 个位置的方案数,在第一种情况中已经说明了计算方法。头部新添加的数是可以任意填的,所以还要乘上系数 \(i\)。

综上,我们有转移:

  • \(f_{i}=i!,0\leq i\leq k\)

  • \(f_{i}=(f_{i-1}-f_{i-k-1}\times A_{k-1}^{i-2})\times i+f_{i-k-1}\times A_{k-1}^{i-2}\)

预处理阶乘和阶乘逆元,时间复杂度 \(O(n)\)。

code

/******
 *zz  *
 *af  *
 *an  *
 *ti  *
 ******/
#include<bits/stdc++.h>

using namespace std;

using E=long long;
using ui=uint32_t;
constexpr E inf=1e16,mod=998244353;

vector<E> fac,ifac;
E n,k;

inline E ksm(E a,E b){
  E ret=1;
  while(b){
    if(b&1) ret=ret*a%mod;
    a=a*a%mod;
    b>>=1;
  }
  return ret;
}

inline E C(E n,E m){
  if(n<0||m<0) return 0;
  return n<m?0:fac[n]*ifac[n-m]%mod*ifac[m]%mod;
}

int main(){
  cin.tie(nullptr),cout.tie(nullptr)->sync_with_stdio(false);

  cin>>n>>k;
  fac.resize(n+1),ifac.resize(n+1);
  fac[0]=ifac[0]=1;
  for(int i=1; i<=n; i++) fac[i]=fac[i-1]*i%mod;
  ifac[n]=ksm(fac[n],mod-2);
  for(int i=n-1; i; i--) ifac[i]=ifac[i+1]*(i+1)%mod;

  vector<E> f(n+1);
  for(int i=0; i<=k; i++) f[i]=fac[i];

  for(int i=k+1; i<=n; i++){
    f[i]=((f[i-1]-f[i-k-1]*fac[k-1]%mod*C(i-2,k-1)%mod+mod)%mod*i+fac[k-1]*f[i-k-1]%mod*C(i-2,k-1)%mod)%mod;
  }

  cout<<f[n];

  return 0;
}

标签:ICPC2020,ifac,Shanghai,个数,最小,ret,using,mod
From: https://www.cnblogs.com/FreshOrange/p/17813582.html

相关文章

  • P9821 [ICPC2020 Shanghai R] Sum of Log
    原题链接题意,求:\[\sum_{i=0}^{X}\sum_{j=[i=0]}^{Y}[i\&j=0]\lfloor\log_2(i+j)+1\rfloor\]为简洁,记\(\lg(x)=\lfloor\log_2(x)\rfloor,n=\max(X,Y)\)由于\(i\&j=0\)则\(i+j=i\operatorname{|}j\)则\(\lg(i+j)=\lg(i\operatorname{|}j)=\lg(......
  • 详解Jvm中时区设置方式,推荐 代码中TimeZone.getTimeZone("Asia/Shanghai") 而不使用Ti
    详解Jvm中时区设置方式原文链接:https://www.45fan.com/article.php?aid=20090934958860528675768691这篇文章memo一下Jvm中关于时区设定的基础操作。Java的时区设定这里列出如下三种方式方式说明TimeZone.setDefault方式通过java的utils下的TimeZone进行动态设定......
  • 2022 Shanghai Collegiate Programming Contest B
    知识点:差分约束Link:https://codeforces.com/gym/103931/problem/B。被卡SPFA了呃呃。一看出题人是这个人:如何看待SPFA算法已死这种说法?-fstqwq的回答-知乎,那没事了。简述给定参数\(n,q\),表示有一个长度为\(n\)的合法括号序列,且有\(q\)组限制。每组限制均为......
  • Shanghai 2006 / UVa 1382 Distant Galaxy (枚举&扫描&动态维护)
    1382-DistantGalaxyTimelimit:3.000seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4128YouareobservingadistantgalaxyusingatelescopeabovetheAstronomyTower,......
  • ICPC2020小米网络选拔赛第一场复盘
    1、看题第一次组队打ICPC,可能任务分配上还有待优化但是有个团队,感觉安心好多。我们有三个人,开始是分开来,每人看三题djn看ABC,jyf看DEF,我看GHI,JK没人看我开始只来得及看了G......
  • The Preliminary Contest for ICPC Asia Shanghai 2019 J. Stone game —— 退背包
     CSLlovesstonegames.Hehas nn stones;eachhasaweight a_iai.CSLwantstogetsomestones.Theruleisthatthepilehegetsshouldhaveahigherore......
  • The 2021 Shanghai Collegiate
    D-Zztrans的班级合照如果没有对序列大小关系的限制,只需要考虑\(a_i\)应该放在第一个序列还是第二个序列,我们定义\(f_{i,j}\)表示前\(i\)个数,第二个序列放了\(j\)......
  • 2019 ICPC Shanghai Site记录
    K-ColorGraph发现\(n\)只有\(16\),可以爆搜!考虑到无奇环和二分图互为充要条件,只要暴力枚举在二分图左边还是右边,根据定义看最多能保留多少条边就可以了!查看代码#in......
  • ICPC2020 南京J 吉司机线段树
    题目是一个序列。两个操作1对L,R里的所有数字对输入x取max。2询问L,R里某一位二进制位的1的个数。n是正常的200000用线段树来维护两个操作。先考虑第一个操作用吉司机......
  • The 2021 ICPC Asia Shanghai Regional Programming Contest I
    I.SteadilyGrowingSteam题链看完题发现可以暴力dp最开始想的状态就是dp[i][j][k]就是左边已经i权重右边已经j权重并且用了k次乘二的maxv然后我们时间复杂度算接近1e......