[LNOI2022]盒
\(LNOI2022\)盒
由于是加的形式,那么可以套路的拆贡献,枚举每条边的贡献就好了
\(40pts\)
//比较显然的事情
//首先确定了一个B数组之后
//最小的移动应该是
//设左右两侧比原先值多的为Max
//少的为Min
///我们考虑每个点只计算向一侧的贡献
//我们的答案是(Max-Limx)*val+(Limn-Min)*val
//n^2的dp很好给出
//dp[i][j]表示前i个选了j个的答案
//不需要貌似,只需要枚举这个点选的,和左边选的,还有右边选的就好了
//枚举这个点选的,枚举左边,复杂度n^2
#include<bits/stdc++.h>
#define int long long
#define MAXN 20005
using namespace std;
const int mod=998244353;
int n,w[MAXN],a[MAXN],Sum[MAXN];
int fac[MAXN+5],inv[MAXN+5];
void Init()
{
fac[0]=inv[0]=1;
fac[1]=inv[1]=1;
for(int i=2;i<=MAXN;i++)
{
fac[i]=(fac[i-1]*i)%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=1;i<=MAXN;i++)
{
inv[i]=(inv[i]*inv[i-1])%mod;
}
}
int C(int n,int m)
{
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void sol()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
Sum[i]=Sum[i-1]+a[i];
}
for(int i=1;i<n;i++)
{
scanf("%lld",&w[i]);
}
int res=0;
for(int i=1;i<n;i++)
{
for(int bed=0;bed<=Sum[n];bed++)
{
int pre=Sum[n]-bed;
{
res+=(abs(Sum[i]-pre))*w[i]%mod*C(pre+i-1,i-1)%mod*C(bed+(n-i)-1,n-i-1)%mod;
res%=mod;
}
}
}
cout<<res<<"\n";
}
int T;
signed main()
{
scanf("%lld",&T);
Init();
while(T--) sol();
}
答案为
\\
\sum_iw[i](2\times\sum_{j=0}^{s[i]}(s_i-j)\binom{j+i-1}{i-1}\binom{S-j+n-i-1}{n-i-1}+\sum_{j=0}^{S}(j-s_i)\binom{j+i-1}{i-1}\binom{S-j+n-i-1}{n-i-1})
\]
考虑后面那个式子
\\
\sum_{j=0}^S j\binom{j+i-1}{i-1}\binom{S-j+n-i-1}{n-i-1}-\sum_{j=0}^S s_i\binom{j+i-1}{i-1}\binom{S-j+n-i-1}{n-i-1}
\\
\sum_{j=0}^S j\binom{j+i-1}{j}\binom{S-j+n-i-1}{n-i-1}-\sum_{j=0}^S s_i\binom{j+i-1}{j}\binom{S-j+n-i-1}{n-i-1}
\\
i\sum_{j=0}^S\binom{j+i-1}{i}\binom{S-j+n-i-1}{n-i-1}-\sum_{j=0}^S s_i\binom{j+i-1}{j}\binom{S-j+n-i-1}{n-i-1}
\\
\]
前半部分\(j\leftarrow j-1\)
\\
i\sum_{j=0}^{S-1}\binom{j+i}{j}\binom{S-j+n-i-2}{S-j-1}-\sum_{j=0}^S s_i\binom{j+i-1}{j}\binom{S-j+n-i-1}{n-i-1}
\]
\]
替换原式
\\
i\binom{n+S-1}{n}-s_i\binom{n+S-1}{S}
\]
那么对于前一个式子,我们变化的只是枚举上界,考虑组合意义变化为,在第 \(i\) 列的纵坐标不能超过 \(s[i]\)
等价于在走到某一行\(/\)列,对应的列\(/\)行不能超过某个数
在第 \(p\) 列 \(y\) 不超过第 \(q\) 行的方案数,等价于第 \(q\) 行到第 \(q+1\) 行,\(x\) 至少为 \(p+1\) 的方案数
\]
我们可以\(O(1)\)的更新值的变化,从而做到线性
#include<bits/stdc++.h>
#define int long long
#define MAXN 3000005
using namespace std;
const int N=3e6+100;
const int INF=LLONG_MAX,mod=998244353;
int my_pow(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
int n,fac[MAXN+5],inv[MAXN+5],Sum[MAXN],w[MAXN],S;
void Init()
{
fac[0]=inv[0]=1;
fac[1]=inv[1]=1;
for(int i=2;i<=MAXN;i++)
{
fac[i]=(fac[i-1]*i)%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=1;i<=MAXN;i++)
{
inv[i]=(inv[i-1]*inv[i])%mod;
}
}
int C(int n,int m)
{
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
struct Solve
{
int n,m,p,q,res;
void Init(int N,int M)
{
n=N;m=M;p=0;q=0;
res=C(n+m-1,m);
return;
}
int move(int P,int Q)
{
while(q<Q)
{
++q;
res+=C(q+p,q)*C(n+m-q-p-1,m-q)%mod;
res%=mod;
}
while(p<P)
{
++p;
res-=C(p+q,p)*C(n+m-p-q-1,n-p)%mod;
res=(res%mod+mod)%mod;
}
return res;
}
}res1,res2;
void sol()
{
cin>>n;
for(int i=1,a;i<=n;i++)
{
cin>>a;
Sum[i]=Sum[i-1]+a;
}
for(int i=1;i<n;i++) cin>>w[i];
S=Sum[n];
res1.Init(n-1,S);
res2.Init(n,S-1);
int Ans=0;
for(int i=1;i<n;i++)
{
int res=0;
res=(res+i*C(n+S-1,n))%mod;
res=(res+mod-Sum[i]*C(n+S-1,S)%mod)%mod;
if(Sum[i]) res=(res+2*Sum[i]*res1.move(i-1,Sum[i]))%mod;
if(Sum[i]) res=(res+mod-2*i*res2.move(i,Sum[i]-1)%mod)%mod;
Ans=(Ans+res*w[i])%mod;
}
printf("%lld\n",Ans);
}
int T;
signed main()
{
Init();
cin>>T;
while(T--) sol();
return 0;
}
[LNOI2022]盒的更多相关文章
- css_02之盒模型、渐变
1.框模型:盒模型,①对象实际宽度=左右外边距+左右边框+左右内边距 + width:②对象实际高度=上下外边距+上下边框+上下内边距 + height: 2.外边距:margin:取值:①top(上 ...
- css3盒模型
css2.1盒模型: 当你定义盒子的宽高后:如果添加padding和border值后盒子的宽高会被撑大 盒子的高度=定义的高度+(padding-top + padding-bottom)+(bord ...
- CSS3伸缩盒Flexible Box
这是一种全新的布局,在移动端非常实用,IE对此布局的相关的兼容不是很好,Firefox.Chrome.Safrai等需要加浏览器前缀. 先说说这种布局的特点: 1)移动端由于屏幕宽度都不一样,在布局的 ...
- 前端开发:css基础知识之盒模型以及浮动布局。
前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西? 为什么这个浮动没有效果? 这个问题楼主已经回答了n遍.今天则是把 ...
- 沙盒解决方案解决SharePoint 2013 以其他身份登陆的问题
众所周知,SharePoint 2013没有像SharePoint 2010那样有一个叫"以其他身份登录"的菜单项. 当然解决方案也很多,比如你可以直接修改Welcome.ascx ...
- SharePoint 2013 沙盒解决方案不能激活(激活按钮不可用)
把沙盒解决方案上传到目标站点的"解决方案"库中,发现"激活"按钮是灰掉的,不可用. 首先,我想到的是权限不足,所以 "以管理员身份"启动IE ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段
在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节1——利用公式创建字段并显示在前端页面
Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的CRM管理系统.由于 Oracle 销售云是基于 Oracle 云环境的,它与传统的管理系统相比,显著特点之一便 ...
- 沙盒SandBox
每个App都有自己的沙盒,也就是一个存储空间.App之间没有权限访问对方的沙盒资源.沙盒的目录下有三个文件夹:Documents.Library.temp 目录结构 Documents:用于存储用户数 ...
随机推荐
- 126_Power BI中使用DAX计算股票RSI及股票均线相关
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前些日子,有朋友在交流股票RSI用DAX处理的问题,由于RSI股票软件的算法几乎都是需要用到股票从上市第一天开始 ...
- 词云图value传递数据不显示(已解决)
问题描述: 今天在做词云图时,虽然词云图能够展现出来,但是后台传递过来的数据(每个词出现的次数)却不显示. 错误原因: 错误的将tooltip写在了series内部,如图: 解决方案: 将toolti ...
- debconf-utils-交互式安装时预配置
debconf-utils是一个可以在Ubuntu下预先配置要安装程序的小工具,它可以避免在安装一个DEB程序时的弹窗输入问题,这可能在编写一键部署脚本的时候非常有用. 以下我们用安装MySQL-AP ...
- mongoDB 命令大全
每日一句 There should be a better way to start a day than waking up every morning. 应该有更好的方式开始新一天, 而不是千篇一 ...
- .Net分表分库动态化处理
介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 背景 最近有个小伙伴来问我,分表下他有一批数据,这个 ...
- C++ 获取指定的重载函数地址
刚刚看到一篇博客,说 std::bind 无法绑定正确的重载函数.这里的问题并不是 std::bind 能力不足,而是将函数名传递给 std::bind 时编译器无法取到这个函数的地址(也就是符号,编 ...
- iphone苹果手机拼健康码行程码教程
因为疫情原因,不管是上班,还是上学,各公司和学校都要求提供全家人的健康码和行程码,并弄成一张拼图,这样方便统计!这就苦了广大用苹果手机的朋友们了,因为苹果手机没有自带的拼图软件. 下面我就教大家一个非 ...
- mysql 开启binlog日志,恢复误删的表、数据、mysql库
linux下开启mysql的binlog日志功能 1.配置mysql配置文件my.cnf(内容如下). #配置文件储存的位置log-bin=mysql-bin#5.7以及以上版本需要配置这一行(保证唯 ...
- docker引起服务器磁盘爆满
服务器异常 又是开开心心打开我心爱的服务器一天: 吔!这是嘛啊?我的服务器域名访问不了了,一直转圈圈超时了,好,打开ssh远程看看,吔!!!还是访问不了,宕机了?怀着一颗憋大便的心情打开了阿里云控制面 ...
- 聊聊 C++ 和 C# 中的 lambda 玩法
这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我 ...