当前位置: 首页 > news >正文

题解:P6811 「MCOI-02」Build Battle 建筑大师

设 $f_i$ 为匹配到第 $i$ 为的序列个数,令 $last_{x,i}$ 表示从第 $i$ 为往前第一个出现 $x$ 的位置,可以得到转移 $f_i=\sum_{j=last_{a_i,i}}^{i-1}{f_j}$。最后答案即为 $\sum{f}$。

由于本题 $a$ 的特殊性,所有 $last$ 都满足 $last_{x,i}=i-m$。带入上式得到 $f_i=\sum_{j=i-m}^{i-1}{f_j}$。使用前缀和优化,可以 $O(n)$ 求出,总复杂度 $O(n^2)$。

继续考虑如何优化,我们对 $f$ 求前缀和,记前缀和数组为 $s$,最终答案即为 $s_n$。根据 $f$ 的递推式,显然有 $s_i=s_{i-m-1}+2 \times f_i=s_{i-m-1} + 2 \times (s_{i-1} - s_{i-m-1}) = 2\times s_{i-1} - s_{i-m-1}$。

想想如何快速求出 $s_n$,考虑其组合意义,我们可以想成从 $i=0$ 处开始走,每步消耗一定代价,每次可以选择以下两种走法(记上一步代价为 $lastv$ 且初始为 $1$,这一步为 $v$):

  1. 让 $i+1 \to i$,花费代价 $v=2\times lastv$;

  2. 让 $i+m+1 \to i$,花费代价 $v=-lastv$;

最后答案 $s_n$ 即为走到 $i=n$ 时所有 $v$ 的和。记第一种操作次数为 $x$,第二种为 $y$。我们就可以直接枚举 $y$,由于 $x + y\times (m + 1) = n$ 得到 $x=n-y\times(m+1)$,那么消耗的代价就是

$$2{x}\times(-1) \times {{x+y} \choose {x}}=2{n-y\times(m+1)}\times(-1)\times{{n-y\times(m+1)+y}\choose{y}}$$

于是有

$$s_n=\sum_{y=0}{\lfloor\frac{n}{m+1}\rfloor}{2\times(-1)^{y}\times{{n-y\times(m+1)+y}\choose{y}}}$$

接下来只要枚举 $m$ 即可,总复杂度 $O(n\log n)$。

#include<bits/stdc++.h>
#define MAXN 2000005
#define int long long
using namespace std;
const int inf=1e18,mod=1e9+7;
int fpow(int a,int b){int tans=1;while(b){if(b&1)tans=tans*a%mod;a=a*a%mod;b>>=1;}return tans;
}
int n,q,a[MAXN],ans[MAXN];
int fac[MAXN],ifac[MAXN],p[MAXN];
void init(){fac[0]=ifac[0]=p[0]=1;for(int i=1;i<=n*2;i++){fac[i]=fac[i-1]*i%mod;ifac[i]=ifac[i-1]*fpow(i,mod-2)%mod;p[i]=p[i-1]*2%mod;}
}
int C(int n,int m){if(n<m)return 0;return fac[n]*ifac[n-m]%mod*ifac[m]%mod;
}
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);scanf("%lld%lld",&n,&q);init();for(int i=1;i<=n;i++){int m=i;for(int j=0;j<=n/(m+1);j++){if(j&1)ans[m]=(ans[m]+mod-p[n-j*(m+1)]*C(n-j*(m+1)+j,j)%mod)%mod;else ans[m]=(ans[m]+p[n-j*(m+1)]*C(n-j*(m+1)+j,j)%mod)%mod;}}for(int i=1;i<=q;i++){int x;scanf("%lld",&x);printf("%lld\n",ans[x]);}return 0;
}
http://www.jsqmd.com/news/28693/

相关文章:

  • [KaibaMath]1017 关于收敛数列与其子数列之间的关系定理的证明
  • Day9综合案例一
  • 以数据为中心的计算机视觉模型性能分析工具-FiftyOne -1
  • [Linux] Linux创建用户流程
  • Zabbix 数据库 history_uint 表损坏修复
  • Azure MCP Server 1.0 正式发布
  • dify+LLM+echarts打造智能可视化数据分析AI助手
  • 操作系统软考复习总结
  • 2025 年 11 月防静电地板厂家推荐排行榜,全钢/全钢陶瓷/硫酸钙/铝合金/pvc架空/防静电地板,OA网络地板,机房防静电地板,办公室网络架空地板公司精选
  • 11.1阅读笔记
  • 2025 年 11 月 Pogopin 弹簧针厂家推荐排行榜,精密测试针,医疗传感器,手机连接器,声学弹簧,仪表锁具,座椅检测优质公司推荐!
  • 2025 年 11 月真空炉厂家推荐排行榜,真空热处理炉,真空回火炉,真空退火炉,真空时效炉,气淬炉,烧结炉,铜钨合金真空焊接炉公司推荐
  • 2025CSP游记
  • Redis单机和集群搭建
  • 2025 年 11 月铣刀厂家推荐排行榜,雕刻机铣刀,金刚石铣刀,木工铣刀,绝缘材料铣刀,碳纤维铣刀,亚克力铣刀,金属加工铣刀公司推荐
  • 电子丨LDO与DC-DC电源管理器件
  • 2025 年 11 月不锈钢厂家推荐排行榜,301不锈钢,316L不锈钢,304不锈钢,420不锈钢,201不锈钢,不锈钢材料公司精选
  • CSP NOIP 2025 游记
  • 2025年10月文章一览
  • 2025 CSP 游记
  • 市面上常见显示屏接口与对应的引脚 - 详解
  • SPF Pro 初学者教程 – 移动取证(分步指南)
  • 002 vue3-admin项目的目录及文件说明
  • Unreal:中文设置小技巧
  • 2025 年 11 月阿里巴巴代运营厂家推荐排行榜,1688代运营,国际站代运营,淘宝代运营,天猫代运营,店铺代运营公司精选
  • PPT 中如何使得水平线水平,垂直线垂直,不要倾斜
  • 2025 年 11 月法兰闸阀厂家推荐排行榜,美标/国标/锻钢/高压/碳钢/高温/焊接闸阀,专业制造与可靠性能口碑之选
  • 2025 年 11 月超滤膜厂家最新推荐,产能、专利、环保三维数据透视
  • 2025 年 11 月超滤膜厂家最新推荐,技术实力与市场口碑深度解析
  • 2025 年 11 月办公家具厂家推荐排行榜,办公桌,办公椅,文件柜,会议桌,办公家具定制公司推荐