LG 11 月 月赛 II T4
LG 11 月 月赛 II T4
看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子
首先看到式子可以化作,
- 如果 \(k = 0\) , $ f(l , r , k) $ 为 $ [l = r]a[l] $
- 否则,$ f(l , r , k) $ 为 $ \displaystyle \sum_{\forall [a,b] \sub [l,r]} f(a,b,k-1) $ 比较通俗的语言就是对于 $ [l,r] $ 的所有子区间求 $ f(a,b,k-1) $ 的和。
于是可以考虑对于每一个 $ a[i] $ 的贡献,其实就是左端点到 $ i $ 以及右端点到 $ i $ 分别选择 $ k $ 个位置,这个就是经典的隔板法了。最后的式子:
$ sum_{1, r, k}=\sum_{i=1}^{r} a_{i}\left(\begin{array}{c}{i+k-2} \ {k-1}\end{array}\right)\left(\begin{array}{c}{r-i+k-1} \ {k-1}\end{array}\right) $
然而出题人把 $ k $ 放到了 $ 998244353 $ 级别,于是只有分块打个表过去了,不知道有没有什么更优秀的处理方法了(
(代码中省略了表。。毕竟太长了)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
//#define int long long
#define MAXN 1000006
#define P 998244353
typedef long long ll;
int n , k;
int power( int a , int x ) {
int ans = 1 , cur = a % P;
while( x ) {
if( x & 1 ) ans = 1ll * ans * cur % P;
cur = 1ll * cur * cur % P , x >>= 1;
}
return ans;
}
int A[MAXN] , B[MAXN] , r[MAXN];
inline void NTT(int* a, int len, int type) {
for (int i = 0; i < len; i++) if (i < r[i]) swap(a[i], a[r[i]]);
for (int mid = 2; mid <= len; mid <<= 1) {
int Wn = power(3, type ? (P - 1) / mid : P - 1 - (P - 1) / mid);
for (int i = 0; i < len; i += mid)
for (int j = i, w = 1, t; j < i + (mid >> 1); j++, w = (ll)w * Wn % P)
t = (ll)w * a[j + (mid >> 1)] % P, a[j + (mid >> 1)] = (a[j] - t + P) % P, a[j] = (a[j] + t) % P;
}
if (!type) for (int inv = power(len, P - 2), i = 0; i < len; i++) a[i] = (ll)a[i] * inv % P;
}
int J[MAXN];
const int jj[] = {/* ... */};
int jk = 0;
int getJ( int x ) {
int cur = k , res = jk;
while( cur + 1 <= x ) ++ cur , res = 1ll * res * cur % P;
while( cur - 1 >= x ) res = 1ll * res * power( cur , P - 2 ) % P , -- cur;
return res;
}
signed main() {
// freopen("input","r",stdin);
cin >> n >> k;
if( k == 1 ) {
for( int i = 1 ; i <= n ; ++ i ) scanf("%d",&A[i]) , A[i] = ( A[i] + A[i - 1] ) % P , printf("%d ",A[i]);
return 0;
}
J[0] = 1; for( int i = 1 ; i < MAXN ; ++ i ) J[i] = 1ll * J[i - 1] * i % P;
jk = jj[k / 1000000];
for( int r = k / 1000000 * 1000000 + 1 ; r <= k ; ++ r )
jk = 1ll * jk * r % P;
int re = getJ( k - 2 ) , re1 = getJ( k - 1 );
// cout << getJ( 10000000 ) << endl;
int tm = re1;
B[0] = re1;
for( int i = 1 ; i <= n ; ++ i )
scanf("%d",&A[i]) , re = 1ll * re * ( i + k - 2 ) % P , re1 = 1ll * re1 * ( i + k - 1 ) % P ,
A[i] = 1ll * A[i] * re % P * power( J[i - 1] , P - 2 ) % P ,
B[i] = 1ll * re1 * power( J[i] , P - 2 ) % P;
int len = 1, l = 0;
while (len <= n * 2) len <<= 1, l++;
for (int i = 0; i < len; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1);
NTT( A , len , 1 ) , NTT( B , len , 1 );
for( int i = 0 ; i < len ; ++ i ) A[i] = 1ll * A[i] * B[i] % P;
NTT( A , len , 0 );
int x = power( 1ll * tm * tm % P , P - 2 );
for( int i = 1 ; i <= n ; ++ i ) printf("%d ", (int) (1ll * x * A[i] % P) );
}
LG 11 月 月赛 II T4的更多相关文章
- 【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)
题目描述# 给你一个长度为\(n\)的字符串\(S\). 有\(m\)个操作,保证\(m≤n\). 你还有一个字符串\(T\),刚开始为空. 共有两种操作. 第一种操作: 在字符串\(T\)的末尾加上 ...
- 【LGR-054】洛谷10月月赛II
[LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...
- BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- csu-2018年11月月赛Round2-div2题解
csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
随机推荐
- ThreadLocalRandom类原理分析
1.Random类及其局限性 public int nextInt(int bound) { if (bound <= 0) throw new IllegalArgumentException ...
- Netty学习笔记(2)ByteBuffer
1. 测试ByteBuffer 1.1 依赖 <dependencies> <dependency> <groupId>io.netty</groupId&g ...
- kiyv Button参数属性
from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.app import ...
- Java RMI学习与解读(一)
Java RMI学习与解读(一) 写在前面 本文记录在心情美丽的一个晚上. 嗯.就是心情很美丽. 那为什么晚上还要学习呢? emm... 卷... 卷起来. 全文基本都是根据su18师傅和其他师傅的文 ...
- [对对子队]会议记录5.19(Scrum Meeting6)
今天已完成的工作 吴昭邦 工作内容:搭建第9关 相关issue:搭建关卡7.8.9 相关签入:feat: 第9关能够通过 何瑞 工作内容:搭建第9关 相关issue:搭建关卡7.8 ...
- BUAA-软件工程-个人总结与心得
提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...
- python3中的bytes和string
原文链接:https://www.cnblogs.com/abclife/p/7445222.html python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分.文本总是 ...
- 零基础学习C语言字符串操作总结大全
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...
- Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并
题目链接 通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的.嗯,然后呢?(っ•̀ω•́)っ 然后,我们就可以对于每一个 ...
- cf13A Numbers(,,)
题意: Little Petya likes numbers a lot. He found that number 123 in base 16 consists of two digits: th ...