[蓝桥杯 2014 省 A] 波动数列

题目链接

[蓝桥杯 2014 省 A] 波动数列

题目描述

观察这个数列:

1   3   0   2   − 1   1   − 2   … 1\ 3\ 0\ 2\ -1\ 1\ -2\ … 1 3 0 2 1 1 2 

这个数列中后一项总是比前一项 增加 2 2 2 或者 减少 3 3 3,且每一项都为整数

栋栋对这种数列很好奇,他想知道长度为 n n n 和为 s s s 而且后一项总是比前一项增加 a a a 或者减少 b b b 的整数数列可能有多少种呢?

输入格式

共一行,包含四个整数 n , s , a , b n,s,a,b n,s,a,b,含义如前面所述。

输出格式

共一行,包含一个整数,表示满足条件的方案数。

由于这个数很大,请输出方案数除以 100000007 100000007 100000007 的余数。

数据范围
  • 1 ≤ n ≤ 1000 1≤n≤1000 1n1000

  • − 1 0 9 ≤ s ≤ 1 0 9 −10^9≤s≤10^9 109s109

  • 1 ≤ a , b ≤ 1 0 6 1≤a,b≤10^6 1a,b106

输入样例:

4 10 2 3

输出样例:

2

样例解释

两个满足条件的数列分别是 2   4   1   3 2\ 4\ 1\ 3 2 4 1 3 7   4   1   − 2 7\ 4\ 1\ -2 7 4 1 2

解法:同余 + dp

我们可以列出数列的 n n n 项,这里假设 x x x 是第一项, d 1 , d 2 , . . . , d n − 1 d_1,d_2,...,d_{n-1} d1,d2,...,dn1的值为 a a a 或者 b b b

s = ( x ) + ( x + d 1 ) + ( x + d 1 + d 2 ) + . . . + ( x + d 1 + d 2 + . . . + d n − 1 ) s = (x) + (x + d_1) + (x + d_1 + d_2) + ... + (x + d_1 + d_2 + ... + d_{n - 1}) s=(x)+(x+d1)+(x+d1+d2)+...+(x+d1+d2+...+dn1)

将其整理一下可以得到 :
s = n × x + ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) s = n \times x + (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1}) s=n×x+(n1)d1+(n2)d2+...+(dn1)

由于 x x x 可以是任意的整数,而 s s s 是给定的,也就是确定的,于是我们可以通过 s s s 得到 x x x

x = s − [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] n x =\frac{ s -[ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})]}{n} x=ns[(n1)d1+(n2)d2+...+(dn1)]

由于 x x x ,也就是数列的第一项,必须是整数。

所以, n n n 必须能够整除 s − [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] s -[ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] s[(n1)d1+(n2)d2+...+(dn1)],也就是 s − [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] s -[ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] s[(n1)d1+(n2)d2+...+(dn1)] 除以 n n n 的余数为 0 0 0

我们能够进一步推导出 s s s , [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] [ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] [(n1)d1+(n2)d2+...+(dn1)] 除以 n n n 的余数相等,也就是 s   m o d   n ≡ [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] m o d    n s\ mod\ n \equiv [ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] \mod n s mod n[(n1)d1+(n2)d2+...+(dn1)]modn,即 s s s , [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] [ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] [(n1)d1+(n2)d2+...+(dn1)] 同余 n n n

所以我们将原问题转换为:求使得 [ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( d n − 1 ) ] [ (n - 1)d_1 + (n - 2)d_2 + ... + (d_{n - 1})] [(n1)d1+(n2)d2+...+(dn1)] s s s 同余 n n n 的方案数有多少种。

我们定义 f [ i ] [ j ] f[i][j] f[i][j] 为从前 i i i 项中选,第 i i i 项元素比前一个 增加 a a a 或者 减少 b b b ,且模 n n n 余数是 j j j 的方案数。

如果第 i i i 项元素选的是 + a +a +a

[ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( n − ( i − 1 ) ) d i − 1 + ( n − 1 ) a ]   m o d   n ≡ j [(n - 1)d_1 + (n - 2)d_2 + ... + (n - (i - 1))d_{i - 1} + (n - 1)a] \ mod\ n \equiv j [(n1)d1+(n2)d2+...+(n(i1))di1+(n1)a] mod nj

将其转换一下:

[ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( n − ( i − 1 ) ) d i − 1 ]   m o d   n ≡ [ j − ( n − 1 ) a ]   m o d   n [ (n - 1)d_1 + (n - 2)d_2 + ... + (n - (i - 1))d_{i - 1}] \ mod\ n \equiv [j - (n - 1)a] \ mod\ n [(n1)d1+(n2)d2+...+(n(i1))di1] mod n[j(n1)a] mod n

所以我们可以得到 f [ i ] [ j ] = f [ i − 1 ] [ j − ( n − 1 ) a ] f[i][j] = f[i - 1][j - (n - 1)a] f[i][j]=f[i1][j(n1)a]

如果第 i i i 项元素选的是 − b -b b

[ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( n − ( i − 1 ) ) d i − 1 − ( n − 1 ) b ]   m o d   n ≡ j [(n - 1)d_1 + (n - 2)d_2 + ... + (n - (i - 1))d_{i - 1} - (n - 1)b] \ mod\ n \equiv j [(n1)d1+(n2)d2+...+(n(i1))di1(n1)b] mod nj

将其转换一下:

[ ( n − 1 ) d 1 + ( n − 2 ) d 2 + . . . + ( n − ( i − 1 ) ) d i − 1 ]   m o d   n ≡ [ j + ( n − 1 ) b ]   m o d   n [ (n - 1)d_1 + (n - 2)d_2 + ... + (n - (i - 1))d_{i - 1}] \ mod\ n \equiv [j + (n - 1)b] \ mod\ n [(n1)d1+(n2)d2+...+(n(i1))di1] mod n[j+(n1)b] mod n

所以我们可以得到 f [ i ] [ j ] = f [ i − 1 ] [ j + ( n − 1 ) b ] f[i][j] = f[i - 1][j + (n - 1)b] f[i][j]=f[i1][j+(n1)b]

综上,我们可以得出:

f [ i ] [ j ] = f [ i − 1 ] [ j + ( n − 1 ) b ] + f [ i − 1 ] [ j − ( n − 1 ) a ] f[i][j] = f[i - 1][j + (n - 1)b] + f[i - 1][j - (n - 1)a] f[i][j]=f[i1][j+(n1)b]+f[i1][j(n1)a]

注意:

  • 由于 j − ( n − 1 ) a j - (n - 1)a j(n1)a 可能小于 0 0 0,我们必须保证它模 n n n 为正数。令 t = j − ( n − 1 ) a t = j - (n - 1)a t=j(n1)a,那么我们最终得到的余数应该是 ( t   m o d   n + n )   m o d   n (t\ mod\ n + n)\ mod\ n (t mod n+n) mod n,这样就保证了最终的余数是正数。
  • f [ 0 ] [ 0 ] f[0][0] f[0][0] 应该初始化为 1 1 1,因为他表示什么也不选也是一种方案,什么也不选那么就只有第一项 x x x
  • 我们最终返回的答案就是 f [ n − 1 ] [ ( s   m o d   n + n )   m o d   n ] f[n - 1][(s\ mod\ n + n)\ mod\ n] f[n1][(s mod n+n) mod n],因为 s s s 有可能是负数,所以我们也需要保证它模 n n n 是一个正数。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

C++代码:

#include <iostream>

using namespace std;

const int N = 1010 , MOD = 100000007;
int f[N][N];

int get_mod(int a , int b){
    return (a % b + b) % b;
}

int main(){
    int n , s, a, b;
    cin>>n>>s>>a>>b;
    
    f[0][0] = 1;
    for(int i = 1;i < n;i++){
        for(int j = 0;j < n;j++){
            int &val = f[i][j];
            val = (val + f[i - 1][get_mod(j - (n - i) * a , n)]) % MOD;
            val = (val + f[i - 1][get_mod(j + (n - i) * b , n)]) % MOD;
        }
    }
    
    cout<<f[n - 1][get_mod(s , n)]<<'\n';
}

Java代码:

import java.io.*;
import java.util.*;

public class Main{
    static final int N = 1010 , MOD = 100000007;
    static long[][] f = new long[N][N];
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    public static int get_mod(int a , int b){
        return (a % b + b) % b;
    }
    
    public static void main(String[] args) throws Exception{
        String[] s1 = in.readLine().split(" ");
        int n = Integer.parseInt(s1[0]);
        int s = Integer.parseInt(s1[1]);
        int a = Integer.parseInt(s1[2]);
        int b = Integer.parseInt(s1[3]);
        
        f[0][0] = 1;
        for(int i = 1;i < n;i++){
            for(int j = 0;j < n;j++){
                f[i][j] = (f[i][j] + f[i - 1][get_mod(j - (n - i) * a , n)]) % MOD;
                f[i][j] = (f[i][j] + f[i - 1][get_mod(j + (n - i) * b , n)]) % MOD;
            }
        }
        
        System.out.println(f[n - 1][get_mod(s,n)]);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化

附件下载 联系工作人员获取附件 本文演示了一种仿真方法&#xff0c;并举例说明了使用一维光栅的出瞳扩张器&#xff08;EPE&#xff09;系统的优化示例。 在此工作流程中&#xff0c;我们使用 Lumerical 构建光栅模型&#xff0c;并使用 RCWA 求解器模拟其响应。完整的EPE系…

云演CTF Blog

1、啥也搞不了&#xff0c;扫目录。出来个console 2、有显示锁掉了 3、抓包&#xff0c;改返回包 改成true&#xff0c;放包 不好意思&#xff0c;不会了&#xff0c;哈哈哈哈哈哈哈哈哈 你会的话&#xff0c;请告诉我&#xff0c;大佬

MyBatis问题记录

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 原因&#xff1a;标注了MapperScan 在 Spring Boot 中&#xff0c;MapperScan 注解用于扫描 MyBatis Mapper 接口的包路径&#xff0c;并将其注册为 Spring Bean。在一些简单的情况下&…

基于SSM的图书馆预约座位系统的设计与实现(部署+源码+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SSM的图书馆预约座位…

【AI】YOLO学习笔记

作为经典的图像识别网络模型&#xff0c;学习YOLO的过程也是了解图像识别的发展过程&#xff0c;对于初学者来说&#xff0c;也可以了解所采用算法的来龙去脉&#xff0c;构建解决问题的思路。 1.YOLO V1 论文地址&#xff1a;https://arxiv.org/abs/1506.02640 YOLO&#x…

Spring框架知识总结

目录 1、Spring框架有哪些设计模式&#xff1f; 2、介绍一下Spring框架和SpringBoot框架&#xff1f; 3、介绍一下SpringBoot具有哪些功能模块&#xff1f; 4、Spring用到了什么组件&#xff1f; 5、什么是IoC? 什么是AOP&#xff1f; 6、SpringBoot运行原理&#xff1…

YOLOv8-Seg改进:轻量化卷积设计 | DualConv双卷积魔改v8结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日&#xff0c;武汉灵动在线科技有限公司&#xff08;以下简称“灵动在线”&#xff09;与 OceanBase 达成合作&#xff0c;旗下品牌猕猴桃游戏的“游戏用户中心&#xff08;微信小程序&#xff09;”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

1128:图像模糊处理(C语言)

一&#xff1a;题目 二&#xff1a;思路分析 1&#xff1a;输入图像 2.根据题目描述1&#xff0c;得出图像四周的数是不变的&#xff0c;即i 1&#xff0c;in&#xff0c;j1&#xff0c;jm时&#xff0c;图像所表示的数值不变 3根据题目描述2可得&#xff0c;中间的值为四周及…

如何装好Home Assistant,四种方式安装HA OS测试

环境&#xff1a; 1.haos_generic-x86-64-11.1.img 2.Balena Etcher 1.18.11 3.haos_ova-11.1.qcow2 4.Ubuntu20.04 5.KVM 6.Docker version 24.0.5 7.HA OS11.2 8.联想E14笔记本 问题描述&#xff1a; 如何装好Home Assistant&#xff0c;四种方式安装HA OS测试 解决…

黑色翻页时钟HTML源码-倒计时单页翻页时钟

黑色翻页时钟HTML源码-倒计时单页翻页时钟这是一个类似fliqlo的黑色翻页时钟HTML源码&#xff0c;它仅包含一个HTML文件&#xff0c;上传到网站后即可使用。该时钟具有查看当前时间、秒表和倒计时功能&#xff0c;并且可以在页面的右下角进行设置。 红色动态炫酷数字时钟html网…

自动化测试如何管理测试数据

在之前的自动化测试框架相关文章中&#xff0c;无论是接口自动化还是UI自动化&#xff0c;都谈及data模块和config模块&#xff0c;也就是测试数据和配置文件。 随着自动化用例的不断增加&#xff0c;需要维护的测试数据也会越来越多&#xff0c;维护成本越来越高&#xff0c;…

(2)Linux 操作系统||基本创建与操作

本章将浅谈一下 "操作系统是什么" 的问题&#xff0c;随后通过讲解一些 Linux 下的基本指令&#xff0c;显示目录内容、跳转操作和文件的创建与删除。在讲解的同时我会穿插一些知识点&#xff0c;比如 Linux 隐藏文件、路径等基础知识。 了解操作系统 什么是操作系统…

【腾讯云云上实验室】用向量数据库融合AI技术:构建下一代智能客服平台

文章目录 前言为什么说用好大模型离不开向量数据库呢?AI训练中的向量维度快速检索非结构化数据的利器 --- 向量数据库AI的海马体--腾讯云向量数据库 一、腾讯云向量数据库介绍重磅组合&#xff0c;行业领先智能化能力产品亮点 二、AI技术在智能客服中的作用AI技术在智能客服平…

【Docker】5. Dockerfile 构建和管理容器化应用程序

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ Dockerfile介绍 基本语法 指令 2️⃣ 实战&#xff1a;Python 的 Flask Web 代码 编译运行 发布到服务器 &#x1f6ec; 文章小结&#x1f4d6; 参考资料 &#x1f6eb; 导读 开发环境 版本号描述文章日期2023-12-15操作系统…

在vue3的js中将一组数据赋值的问题

代码: if (res.data) { myPrizeList.value res.data console.log(myPrizeList.value,myPrizeList.value) const giftList ref() console.log(JSON.parse(JSON.stringify(myPrizeList.val…

如何预防最新的.locked、.locked1勒索病毒感染您的计算机?

尊敬的读者&#xff1a; 近期&#xff0c;网络安全领域迎来一股新潮——.locked、.locked1勒索病毒的威胁&#xff0c;其先进的加密技术令人生畏。本文将深入剖析.locked、.locked1勒索病毒的阴谋&#xff0c;提供特色数据恢复策略&#xff0c;并揭示锁定恶劣行径的先锋预防手…

【已解决】解决无法找到sun.misc.BASE64Encoder的jar包的解决方法

idea中可能会出现没有sun.misc.BASE64Encoder的jar包。但是64位编码却需要用到.BASE64Encoder。有以下两种方法&#xff1a; 错误现象&#xff1a; 错误原因&#xff1a; 1.JDK改为8&#xff08;原因是/lib/tool.jar和/lib/rt.jar已经从Java SE 9中删除&#xff09;&#xff…

在线客服系统定价因素解析:影响价格的关键因素

跨境电子商务公司必不可少的工具就是在线客服系统。企业选择在线客服系统的时候免不了要对不同产品的功能性、价格、服务等因素进行考量。今天这篇文章&#xff0c;我们就来探讨一下在线客服系统的定价因素有哪些&#xff1f;探究市面上的在线客服系统价格各异的影响因素。为大…

《Kotlin核心编程》笔记:反射、注解和加锁

Kotlin 和 Java 反射 1&#xff09;Kotlin 的 KClass 和 Java 的 Class 可以看作同一个含义的类型&#xff0c;并且可以通过.java和.kotlin方法在KClass和Class之间互相转化。2&#xff09;Kotlin 的 KCallable 和 Java 的 AccessiableObject 都可以理解为可调用元素。Java 中构…
最新文章