Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

题目

称一个长为n的数列a是fancy的,当且仅当:

1. 数组内至少有一个元素在[x,x+k-1]之间

2. 相邻项的差的绝对值不超过k,即|a_{i}-a_{i+1}|\leq k

t(t<=50)组样例,每次给定n(1<=n<=1e9),x(1<=x<=40),

求fancy的数组的数量,答案对1e9+7取模

思路来源

灵茶山艾府群 && 官方题解

题解

看到至少的字眼,首先想到容斥,用总的减不满足的,

本题中,合法方案数=[最小值<=x+k-1的方案数]-[最大值<x的方案数]

最小值<=x+k-1的方案数

第一个数字选0,后面每个数都有2k+1种选择方式,最后把最小值往上平移到[0,x+k-1]之间

方案数为(x+k)*(2*k+1)^{n-1}

最小值<x的方案数

即长为n的数列,使用的值均在[0,x-1]的方案数,

注意到x<=40,所以可以dp[i][j]表示长为i的数组最后一个是j的方案数

转移时,只要abs(j1-j2)<=k,就可以从j1转移到j2,

构造上述转移矩阵,矩阵快速幂求出其n-1次幂,

由于长度为1时对应的[0,x-1]的向量均为1,所以将每一行的和从答案中减掉即可

代码

// Problem: F. Fancy Arrays
// Contest: Codeforces - Educational Codeforces Round 157 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1895/problem/F
// Memory Limit: 512 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int mod=1e9+7;
int t,n,x,k;
int modpow(int x,int n,int mod){int res=1;for(;n;n>>=1,x=1ll*x*x%mod){if(n&1)res=1ll*res*x%mod;}return res;
}
struct mat{static const int N=42;ll c[N][N];int m,n;mat(){memset(c,0,sizeof(c));m=n=N;}mat(int a,int b):m(a),n(b){memset(c,0,sizeof(c));}void clear(){memset(c,0,sizeof(c));}void E(){int mn=min(m,n);for(int i=0;i<mn;i++){c[i][i]=1;}}mat operator *(const mat& x){mat ans(m,x.n);for(int i=0;i<m;i++)for (int k=0;k<n;k++){if(!c[i][k])continue;//小剪枝for (int j=0;j<x.n;j++)(ans.c[i][j]+=c[i][k]*x.c[k][j]%mod)%=mod;//能不取模 尽量不取模}//这里maxn=2 故不会超过ll 视具体情况 改变内部取模情况return ans;}friend mat operator^(mat x,ll n){//幂次一般为ll 调用时a=a^(b,n) 等价于a=b^nmat ans(x.m, x.m);ans.E();for(;n;n>>=1,x=x*x){//x自乘部分可以预处理倍增,也可以用分块加速递推if(n&1)ans=ans*x;}return ans;}
};
int sol(){sci(n),sci(x),sci(k);int ans=1ll*(x+k)*modpow(2*k+1,n-1,mod)%mod;if(!x)return ans;mat a(x,x);rep(i,0,x-1){rep(j,0,x-1){if(abs(i-j)<=k)a.c[i][j]=1;}}a=a^(n-1);rep(i,0,x-1){int sum=0;rep(j,0,x-1){sum=(sum+a.c[i][j])%mod;}ans=(ans-sum+mod)%mod;}return ans;
}
int main(){sci(t); // t=1while(t--){pte(sol());}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3系列之-启动类详解

Spring Boot是一个功能强大、灵活且易于使用的框架&#xff0c;它极大地简化了Spring应用程序的开发和部署流程&#xff0c;使得开发人员能够更专注于业务逻辑的实现。在我们的Spring Boot 3系列之一&#xff08;初始化项目&#xff09;文章中&#xff0c;我们使用了Spring官方…

打印机:Open the front cover and pull out the drum unit

参考&#xff1a; https://support.brother.com/g/b/faqend.aspx?cgb&langen&prodmfcl8690cdw_eu_as&faqidfaq00000154_082#:~:textReplacing%20the%20drum%20unit%20Make%20sure%20the%20machine,unit%20out%20of%20the%20machine%20until%20it%20stops. 故障现…

Box2d 物理画线,Cocos Creator 3.8

一个简易的画线刚体Demo 效果 抱歉&#xff0c;放错图了&#xff0c;以上是 孙二喵 iwae https://forum.cocos.org/t/topic/142673[1] 的效果图。本Demo是根据文章的思路&#xff0c;合成的代码。首先&#xff0c;感谢孙二喵的技术分享。 以下是最终效果图 使用 版本 Cocos Cre…

产业园区中工业厂房的能源综合配置——工业园区综合能源数字化系统建设方案

以下内容转自微信公众号&#xff1a;PPP产业大讲堂&#xff0c;《产业园区中工业厂房的能源综合配置》。 园区工业地产中能源综合配置存在的问题 我国园区工业地产建设已历经近40年的发展, 园区在区域经济发展、产业集聚方面发挥了重要的载体和平台作用, 有力推动了我国社会经…

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker&#xff1a;您要如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f;而这个就是使用容器。Docker解决了运行环境和配置问题…

SMART PLC开放式以太网通信(UDP通信)

西门子S7-200 SMART PLC不仅支持开放式以太网通信,还支持MODBU-RTU,以及ModbusTcp通信,详细内容请参考下面文章: MODBUS-RTU主站通信 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯…

NVIDIA-SMI has failed because it couldn“t communicate with the NVIDIA driver .

文章目录 报错原因分析解决办法防患于未然 报错 执行nvidia-smi报错 NVIDIA-SMI has failed because it couldn"t communicate with the NVIDIA driver . Make sure that the atest NVIDIA driver is installed and running.运行使用gpu的docker容器时 NVIDIA Docker …

【小白专用】PHP基本语法 23.11.04

PHP基本语法 PHP是超文本预处理器 由服务器解析执行 可以与 html 进行混编(嵌入) ,PHP是一种弱类型语言 1.1 PHP标记 PHP和其他Web语言一样&#xff0c;都是用一对标记将PHP代码包含起来&#xff0c;以便和HTML代码区分开来。PHP支持4种风格的标记&#xff0c;如表所示。 标…

从零开始搭建微服务(一)

构建项目父工程 添加公共核心模块 安装nacos 安装nacos nacos 文档地址&#xff1a; https://nacos.io/zh-cn/docs/what-is-nacos.html 本文使用版本2.2.2 下载地址&#xff1a;https://github.com/alibaba/nacos/archive/refs/tags/2.2.2.zip 使用nacos 我们下载是源代码 解…

shell脚本代码混淆

文章目录 起因安装 Bashfuscator安装BashfuscatorBashfuscator的使用 起因 很多时候我并不希望自己的shell脚本被别人看到&#xff0c;于是我在想有没有什么玩意可以把代码加密而又正常执行&#xff0c;于是我想到了代码混淆&#xff0c;简单来看一下&#xff1a; 现在我的目…

自动识别图片文字表格:高效神器,告别繁琐手动操作

现代科技的快速发展为我们的生活带来了许多便利和效率提升。在数据处理和文档管理方面&#xff0c;自动化技术也日益成熟和普及。一项非常有用的技术是自动识别文字生成表格&#xff0c;它可以将大量的图片识别成文本并转换为表格形式&#xff0c;使得数据的整理和分析更加简便…

NFS服务以及静态路由及临时IP配置

目录 一、NFC服务基础知识 1、NFS服务初相识 2、NFS服务工作原理 二、NFC服务基础操作 1、NFS服务端配置 2、NFS服务 - exports 相关参数 3、NFS服务 - 命令相关 三、RPC 远程调度 四、静态路由及临时IP配置 1、Linux 静态路由相关命令 2、Linux 临时IP地址添加与删除…