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

news2024/11/27 12:36:39

题目

称一个长为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^n
        mat 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=1
	while(t--){
		pte(sol());
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【错误解决方案】ModuleNotFoundError: No module named ‘my_fake_useragent‘

1. 错误提示 ModuleNotFoundError: No module named my_fake_useragent&#xff0c;这意味着你试图导入一个名为 my_fake_useragent 的模块&#xff0c;但Python找不到这个模块。 2. 解决方案 检查模块名是否正确: 确保你试图导入的模块名是正确的。也许你拼写错误或者大小写不…

NeurIPS 2023 | 基于多模态统一表达的跨模态泛化

©PaperWeekly 原创 作者 | 夏炎 学校 | 浙江大学 研究方向 | 多模态 论文标题&#xff1a; Achieving Cross Modal Generalization with Multimodal Unified Representation 模型&代码地址&#xff1a; https://github.com/haihuangcode/CMG 在本文中&#xff0c;我们…

LeetCode 面试题 16.17. 连续数列

文章目录 一、题目二、C# 题解 一、题目 给定一个整数数组&#xff0c;找出总和最大的连续数列&#xff0c;并返回总和。 示例&#xff1a; 输入&#xff1a; [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a; 6 解释&#xff1a; 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。…

树结构及其算法-线索二叉树

目录 树结构及其算法-线索二叉树 C代码 树结构及其算法-线索二叉树 虽然我们把树转换为二叉树可减少空间的浪费——由2/3降低到1/2&#xff0c;但是如果仔细观察之前使用链表建立的n节点二叉树&#xff0c;那么会发现用来指向左右两个节点的指针只有n-1个链接&#xff0c;另…

如何快速导出、备份微信通讯录好友联系人微信号

6-9 如果因工作需要&#xff0c;你有多个微信&#xff0c;并且你的业务开发的客户都在这些微信里&#xff0c;将会面临一个问题&#xff0c;那就是备份问题&#xff0c;因为通过微信做业务&#xff0c;如果遇到微信不小心被封号&#xff0c;或者离职的交接等情况&#xff0c;客…

【Mybatis小白从0到90%精讲】03:编写Mapper,第一个入门程序

文章目录 前言一、创建mysql user表二、注解方式三、XML方式四、编写main方法调用前言 映射器Mapper是 MyBatis 中最重要的文件,简单的讲主要用来映射SQL语句。 映射器有两种实现方式:注解方式、XML文件方式(推荐)。 接下来演示通过两种方式,开发Mybatis第一个入门程序,…

GEE数据集——2019、2020、2021、2022和2023年全球固定宽带和移动(蜂窝)网络性能Shapefile 格式数据集

全球固定宽带和移动&#xff08;蜂窝&#xff09;网络性能 全球固定宽带和移动&#xff08;蜂窝&#xff09;网络性能&#xff0c;分配给缩放级别 16 网络墨卡托图块&#xff08;赤道处约 610.8 米 x 610.8 米&#xff09;。数据以 Shapefile 格式和 Apache Parquet 格式提供&…

安装MySQL时出现 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。

--------------------------- mysqld.exe - 系统错误 --------------------------- 由于找不到 MSVCR120.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。 --------------------------- 确定 --------------------------- 安装MySQL时出现 “This appl…

C语言实现九九乘法表

学习C语言后&#xff0c;我们会发现打印九九乘法表是很简单的&#xff0c;话不多说&#xff0c;我们上代码&#xff01; 目录 1.函数代码 2.运行结果 1.函数代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i 1;int j 1;int n 0;//行数in…

麒麟系统 UFW 操作文档

麒麟系统 UFW 操作文档 1. UFW 介绍 ufw&#xff08;简单防火墙 Uncomplicated FireWall&#xff09;真正地简化了 iptables&#xff0c;虽然 ufw 的底层依 然会调用 iptables&#xff0c;但是配置防火墙规则时操作更加方便&#xff0c;命令更加简洁&#xff0c;本文档主要介…

49基于matlab的Non dominated sorting genetic algorithm -II(NSGA-Ⅱ)多目标遗传算法

基于matlab的Non dominated sorting genetic algorithm -II&#xff08;NSGA-Ⅱ&#xff09;多目标遗传算法&#xff0c;其优势是降低了非劣排序遗传算法的复杂性&#xff0c;具有运行速度快&#xff0c;解集的收敛性好的优点&#xff0c;成为其他多目标优化算法性能的基准。程…

Python自定义函数练习(持续更新中~)

1.计算矩阵的面积和周长&#xff1a; class Rectangle:def __init__(self, width, height):self.width widthself.height heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width self.height)if __name__ "__main__"…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…

c语言实现http下载功能,显示进度条和下载速率

#include <stdio.h>//printf #include <string.h>//字符串处理 #include <sys/socket.h>//套接字 #include <arpa/inet.h>//ip地址处理 #include <fcntl.h>//open系统调用 #include <unistd.h>//write系统调用 #include <netdb.h>//…

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PSO-VMD粒子群算法PSO优化VMD变分模态分解 可直接运行 分解效果…

Linux C/C++下抓包分析mysql流量(协议解析)

MySQL通信协议是一个有状态的协议&#xff0c;主要用于MySQL客户端与服务器之间的通信。这个协议在MySQL客户端连接器&#xff08;如Connector/C、Connector/J等&#xff09;、MySQL Proxy以及主从复制中都有实现。 该协议的特性包括&#xff1a;支持SSL、压缩和认证等功能。 …

【JavaScript】零碎知识点总结_2

1. 引入网站图标 可以直接放在根目录 还可以 link 引入&#xff08;推荐&#xff09; <linkrel"shortcut icon"href"./assets/favicon.ico"type"image/x-icon">2. 转换为数字 123 -> 123 除 做字符串拼接&#xff0c;算术运算符都…

梳理自动驾驶中的各类坐标系

目录 自动驾驶中的坐标系定义 关于坐标系的定义 几大常用坐标系 世界坐标系 自车坐标系 传感器坐标系 激光雷达坐标系 相机坐标系 如何理解坐标转换 机器人基础中的坐标转换概念 左乘右乘的概念 对左乘右乘的理解 再谈自动驾驶中的坐标转换 本节参考文献 自动驾驶…

map和set的例题

随机链表的复制 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 我们为什么要拷贝原链表的结点一个个链接到原链表结点的后面&#xff1f; 其实就建立了原链表结点与拷贝链表每个结点的一种映射关系, 方便我们设置拷贝结点的random域。 那我们现在C有了map: …

WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流&#xff0c;感谢大佬讲解 在XAML中&#xff0c;可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性&#xff1a; 属性&#xff1a;可以绑定到对象的属性&#xff0c;例如控件的Text、Visibility、IsEnabled等属性。 集合&am…