设平均数为$x$,那么有差值数组$b_i=a_i-x$。

考虑用类似于均分纸牌的方法来解决本题,从左到右依次考虑每堆书,直接乘上预处理好的组合数,然后清零$b_i$。

在实际操作中,将冗余的操作忽略,肯定是由大书堆向小书堆的方向移动,并且每对相邻位置的移动方向是确定的。

所以我们可以一遍扫过去,如果当前这堆书多了,就往后移;要是不够,就从后面拿过来。每次使当前位置达到平均值,并且将富余/缺口推给下一个位置。

要是后面也不够填补当前位置的缺口呢?我们可以想到,在实际操作中,书一定会先从更后面传递过来,而到了恰好下一个位置时,下一个位置多出来的书一定会是刚好填补当前位置的缺口的。所以在这一步计算方案数时,就可以直接使用“下个位置的书总数是平均数加上当前位置的缺口量”这样的状态。不过“推缺口”操作还是一样的。

具体地说,考虑$b_i$:

  1. 若$b_i>0$,则将第$i$堆中超出的所有书移到第$i+1$堆,方案数为$\dbinom{a_i}{b_i}$。
  2. 若$b_i<0$,则将第$i+1$堆中取出$-b_i$移到第$i$堆。若第$i+1$堆当前足够多,方案数为$\dbinom{a_{i+1}}{-b_i}$;若不够多,方案数为$\dbinom{x-b_i}{-b_i}$。

核心的贪心思想如上。接下来解决组合数的问题。

当$k\le 4\times 10^3$时,可以使用杨辉三角预处理组合数,时间复杂度为$O(k^2)-O(Tn)$;当$k\le 10^6$时,预处理阶乘及其乘法逆元,时间复杂度$O(k)-O(Tn)$。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#define IL inline
#define RG register
using namespace std;
typedef long long LL;
const int N=1e3;
const int M=1e6;
#define RI RG int
#define RC RG char
#define RL RG LL
const LL mod=998244353; IL void qr(RI &x){
x=0; RC ch=getchar();
while(!isdigit(ch)) ch=getchar();
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
} IL void qw(RL &x,RC ch){
RI k=0,s[23];
if(x==0) s[k=1]=0;
else for(;x;x/=10) s[++k]=x%10;
for(;k;k--) putchar(s[k]+'0');
putchar(ch);
} int T,n;
int a[N+3],b[N+3];
LL jc[M+3],jv[M+3]; IL LL qpow(RL a,RL b){
LL ans=1;
for(a%=mod;b;a=a*a%mod,b>>=1)
if(b&1) ans=ans*a%mod;
return ans;
} IL LL C(RI n,RI m){
RL x=jc[n],y=(jv[m]*jv[n-m])%mod;
return x*y%mod;
} IL void init(){
jc[0]=jv[0]=1;
for(RI i=1;i<=M;i++)
jc[i]=(jc[i-1]*i)%mod;
jv[M]=qpow(jc[M],mod-2);
for(RI i=M;i>=2;i--)
jv[i-1]=(jv[i]*i)%mod; } IL void sol(){
qr(n);
for(RI i=1;i<=n;i++)
qr(a[i]); RI sum=0;
for(RI i=1;i<=n;i++)
sum+=a[i];
RI ave=sum/n;
for(RI i=1;i<=n;i++)
b[i]=a[i]-sum/n; RL ans=1;
for(RI i=1;i<n;i++)
if(b[i]>0){
ans=ans*C(a[i],b[i])%mod;
a[i+1]+=b[i];
b[i+1]+=b[i];
a[i]-=b[i];
b[i]=0; }
else
if(b[i]<0){
ans=ans*C(max(ave-b[i],a[i+1]),-b[i])%mod;
a[i+1]+=b[i];
b[i+1]+=b[i];
a[i]-=b[i];
b[i]=0; }
qw(ans,'\n'); } int main(){
init();
qr(T);
while(T--)
sol(); return 0; }

T137223 节能主义的更多相关文章

  1. 【黑金原创教程】【Modelsim】【第三章】理想就是美丽

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  2. 【黑金原创教程】【Modelsim】【第四章】激励文本就是仿真环境

      声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/ ...

  3. 【黑金原创教程】【Modelsim】【第六章】结束就是开始

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. C-RAN 集中化、协作化、云化、绿色节能(4C)

    中国移动C-RAN力拼第4个C:2018年6月外场组网验证 http://www.c114.net ( 2016/11/22 07:41 ) C114讯 11月22日早间消息(子月)2009年,中国移 ...

  5. 高龄“潮男”优衣库老板柳井正_榜样_奢华主义_YOKA时尚网

    高龄"潮男"优衣库老板柳井正_榜样_奢华主义_YOKA时尚网 高龄"潮男"优衣库老板柳井正

  6. [置顶] LED办公楼宇照明节能方案及城市夜景照明节能方案

    LED照明办公楼宇节能方案 .通用标准灯头,可直接替换现有卤素灯.白炽灯.荧光灯.

  7. 第四届河南省ACM 节能 区间DP

    1001: 节 能 时间限制: 1 Sec  内存限制: 128 MB 提交: 21  解决: 9 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多 ...

  8. 如何用ABP框架快速完成项目(9) - 用ABP一个人快速完成项目(5) - 不要执着于设计模式和DDD理论,避免原教旨主义

    为什么要写这节文章呢?   首先主动看我这系列文章和参加活动课程的同学, 肯定是积极好学的. 所以很大概率是学过设计模式和DDD理论的. 很大概率不是走一点都不懂设计模式和DDD理论这个极端, 而是走 ...

  9. .NET开源项目 QuarkDoc 一款自带极简主义属性的文档管理系统

    有些话说在前头 因为公司产品业务重构且功能拆分组件化,往后会有很多的接口文档需要留存,所以急需一款文档管理系统.当时选型要求3点: 1.不能是云平台上的Saas服务,整个系统都要在自己公司部署维护(数 ...

  10. 最课程阶段大作业06:U度节能平台控制系统

    除了互联网项目,当今社会还有一个概念非常流行,那就是:物联网.什么是物联网?物联网是通过传感设备,按约定的协议,把任意物品与互联网相连接,进行信息交换和通信,以实现智能化识别.定位.跟踪.监控和管理的 ...

随机推荐

  1. linux 基础(6)简单认识 bash

    shell 和 bash 是什么? shell 是一种应用程序,在这个程序里输入文字指令,系统就会做出响应的操作.这个"壳程序"是我们使用系统各种功能的接口,学会了 shell 就 ...

  2. 剑指 Offer 32 - I. 从上到下打印二叉树(java解题)

    目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 1. 题目 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.   例如: 给定二叉树: [3,9, ...

  3. 有效的字母异位词&两个数组的交集& 快乐数& 两数之和

    一.有效的字母异位词 242. 有效的字母异位词 1.方法概述 因为本题中字符串只包含小写字母,就可以定义一个数组来记录字符串中字符出现的次数.遍历第一个字符串,用charAt拿到对应的小写字母然后减 ...

  4. C++并发-同步并发

    1.等待事件 std::mutex m; void wait() { std::unique_lock<std::mutex> lk(m); lk.unlock(); std::this_ ...

  5. SpringMVC的常用注解、参数绑定、转发与重定向

    SpringMvc的常用注解 @RequestMapping() SpringMvc通过@RequestMapping注解将URL请求与业务的方法进行映射,在控制器的类定义处定义方法处都可以添加@Re ...

  6. quasar使用electron打包

    quasar使用electron打包  从构建好的项目中,我们不难发现,electron打包有两种方式: electron-packager打包  这篇博客是通过我尝试了很多种方法之后,最先开始,我使 ...

  7. LC761.特殊的二进制序列

    import org.junit.jupiter.api.Test;import java.util.ArrayList;import java.util.Collections;import jav ...

  8. LG P4168 [Violet]蒲公英

    \(\text{Problem}\) 强制在线静态询问区间众数 \(\text{Solution}\) 不得不说 \(vector\) 是真的慢 做 \(LOJ\) 数列分块入门 \(9\) 卡时间卡 ...

  9. 代码随想录算法训练营day16 | leetcode ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

    基础知识 二叉树的多种遍历方式,每种遍历方式各有其特点 LeetCode 104.二叉树的最大深度 分析1.0 往下遍历深度++,往上回溯深度-- class Solution { int deep ...

  10. mssql 常用sql 语句

    ----insert ----delete----update----select ----选择数据库进行操作select top 1 * from smzx2018.dbo.tbuseruse sm ...