题目:

给定nnn和kkk,问有多少个[1,n][1,n][1,n]的排列aaa满足对于∀i>k,ai>min⁡1≤j≤k{ai−j}\forall i>k,a_i>\min \limits_{1 \le j \le k}\{a_{i-j}\}∀i>k,ai​>1≤j≤kmin​{ai−j​},答案模998244353。
(1≤n,k≤107)(1 \le n,k \le 10^7)(1≤n,k≤107)

题解:

首先可以发现1一定在[1,k][1,k][1,k]的位置中,假设为xxx,那么可以在[1,x−1][1,x-1][1,x−1]的位置上安排任意的数,然后对于最小的没有安排在[1,x][1,x][1,x]范围内的数,设为yyy,这个数一定要安排在[x+1,x+k][x+1,x+k][x+1,x+k]中的一个位置上。那么就可以发现安排完1的位置xxx后,再将[1,x−1][1,x-1][1,x−1]的位置填满,再将剩下的没安排的数离散化一下,问题就变成了一个原问题的子问题了,所以可以用dpdpdp来搞。
令dpidp_idpi​为给定i,ki,ki,k的问题的答案,那么可以通过枚举111的位置来进行转移,即
dpi=∑j=1kAi−1j−1dpi−jdp_i=\sum_{j=1}^k A_{i-1}^{j-1}dp_{i-j}dpi​=j=1∑k​Ai−1j−1​dpi−j​这个式子可以继续优化,
dpi=∑j=1k(i−1)!(i−j)!dpi−jdp_i=\sum_{j=1}^k \frac{(i-1)!}{(i-j)!}dp_{i-j} dpi​=j=1∑k​(i−j)!(i−1)!​dpi−j​
维护前缀和∑j=1i1j!dpj\displaystyle \sum_{j=1}^i\frac{1}{j!}dp_jj=1∑i​j!1​dpj​即可线性递推。

复杂度:O(n)O(n)O(n)

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<bitset>
#include<sstream>
#include<ctime>
//#include<chrono>
//#include<random>
//#include<unordered_map>
using namespace std;#define ll long long
#define ls o<<1
#define rs o<<1|1
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
const double pi=acos(-1.0);
const double eps=1e-6;
const int mod=998244353;
const int INF=0x3f3f3f3f;
const int maxn=1e7+5;
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,k;
ll dp[maxn],pre[maxn],inv[maxn],p[maxn];
int que[maxn];
ll qpow(ll a,ll p=mod-2){ll res=1;while(p){if(p&1)res=res*a%mod;a=a*a%mod;p>>=1;}return res;
}
void init(int n){pre[0]=1;for(int i=1;i<=n;i++)pre[i]=pre[i-1]*i%mod;inv[n]=qpow(pre[n]);for(int i=n-1;i>=0;i--){inv[i]=inv[i+1]*(i+1)%mod;}
}
int main(void){// freopen("in.txt","r",stdin);init(10000000);scanf("%d%d",&n,&k);p[0]=0;for(int i=1;i<=k;i++){dp[i]=pre[i];p[i]=(p[i-1]+dp[i]*inv[i]%mod)%mod;}for(int i=k+1;i<=n;i++){dp[i]=(p[i-1]-p[i-k-1])%mod*pre[i-1]%mod;p[i]=(p[i-1]+dp[i]*inv[i]%mod)%mod;}printf("%lld\n",(dp[n]+mod)%mod);return 0;
}

2020ICPC上海E The Journey of Geor Autumn相关推荐

  1. 组合计数 ---- 2020 icpc 上海 The Journey of Geor Autumn(思维划分问题计数+预处理优化)

    题目链接 题目大意: 就是你有一个nnn的全排列,现在问你去重排这个排列使得对于给定的kkk,满足对于任意的ai,i>ka_i,i>kai​,i>k的都有ai>min(ai−1 ...

  2. 2020icpc上海(重温经典)

    2020icpc上海(重温经典) 导语 涉及的知识点 题目 B D G H I M 参考文献 导语 涉及的知识点 思维,几何,搜索 链接:第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海 ...

  3. 2020icpc上海赛G题 Fibonacci详解

    Fibonacci(icpc2020上海赛) 链接:icpc2020上海赛G题Fibonacci 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语 ...

  4. 2020icpc上海 Mine Sweeper II (思维)

    题目链接:B-Mine Sweeper II_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海) (nowcoder.com)a 题目大意:给你两个大小为 n * m 的扫雷图 A, B ...

  5. 2020ICPC(上海) - Walker(分类讨论+二分)

    题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...

  6. 2020ICPC(上海) - Sum of Log(数位dp)

    题目链接:点击查看 题目大意:给出 X 和 Y,求  题目分析:因为涉及到了位运算且看似可以递推,所以考虑数位dp,因为统计答案时的 i 和 j 的与为 0,所以 i + j = i & j, ...

  7. 2020ICPC上海 C.Sum of Log

    题目链接 题目描述 Given two non-negative integers X{X}X and Y{Y}Y, determine the value of ∑i=0X∑j=[i=0]Y[i&a ...

  8. 2020ICPC上海 D Walker(思维、二分、三分)

    链接 题目描述 As a world-famous traveler, Prof. Pang's research interest is to travel as many places as po ...

  9. 2020ICPC上海区域赛总结

    怎么说呢 想过打铁 但没想到真打铁了其实挺难受的 开局十分钟我交了第一发签到题,由于特判没有return0return 0return0白给了一发,加上之后又马上冲了一发结果还是WA了,这时我就一直在 ...

最新文章

  1. Tian Ji -- The Horse Racing
  2. linux之xargs详解
  3. spring cloud config将配置存储在数据库中 1
  4. Python 堡垒机介绍
  5. Apache Dubbo 3.0.0 正式发布 - 全面拥抱云原生
  6. 共享语义 unix语义_语义UI按钮
  7. Go语言web框架 gin
  8. Oracle 表空间常用sql
  9. java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?
  10. python基础知识学习笔记(1)
  11. windows ad 域下配置L2TP ***服务器 企业防火墙端口配置
  12. 电子计算机厂 四月份生产计,一题多解 分数和百分数应用题(1)
  13. ue4渲染速度太慢_技术汇丨如何在UE4中实现最佳性能和高质量视觉效果
  14. RouterOS安装以及搭建DHCP PPPoE PPTP L2TP服务
  15. 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)
  16. 飞机大战(简单版)(C/C++) (VS)
  17. VBA金额转换中文大写(原创新解版)
  18. mimikatz猕猴桃工具使用教程
  19. ps ui html,PS UI设计技巧(3)
  20. arcgis10.2以上版本转换测量队节点所在TXT为所需格式(arctoolbox-samples-features-creat featrure from text file所需要的面格式)

热门文章

  1. python爬虫及其可视化
  2. 测试运行以及完整代码
  3. uefi安装win10原版镜像|uefi gpt模式安装win10官方系统教程
  4. Centos Stream 9安装docker-ce
  5. eps罗马柱头制作方法_元阳好的eps罗马柱批发价格,罗马柱子制作
  6. 应该手动抛出什么异常?RuntimeException?
  7. 个人训练赛第二十场:对撞
  8. 如何在OC类里 调用swift类
  9. 2019年丰巢科技Java面试题
  10. Android 时间更新机制之网络更新时间