【LOJ】#3090. 「BJOI2019」勘破神机

本文详细解析了洛谷平台上的题目“BJOI2019勘破神机”。通过学习BM算法,解决了斐波那契数列相关问题,利用特征根方程和多项式技巧,实现了高效求解。复杂度为k^2logr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LOJ#3090. 「BJOI2019」勘破神机

为了这题我去学习了一下BM算法。。

很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列

3的地方是\(G_{1} = 3,G_{2} = 11\)其中下标表示长度的\(\frac{1}{2}\),可以得到\(G_{3} = 4G_{2} - G_{1}\)

然后我们列一波特征根方程,可以得到

\(m = 2\)
$$
\left{\begin{matrix}
x_{1} = \frac{1 + \sqrt{5}}{2}
\ x_{2} = \frac{1 - \sqrt{5}}{2}
\ c_{1} = \frac{5 + \sqrt{5}}{10}
\ c_{2} = \frac{5 - \sqrt{5}}{10}

\end{matrix}\right.
$$

\(m = 3\)
$$
\left{\begin{matrix}
x_{1} = 2 + \sqrt{3}
\ x_{2} = 2 - \sqrt{3}
\ c_{1} = \frac{3 + \sqrt{3}}{6}
\ c_{2} = \frac{3 - \sqrt{3}}{10}

\end{matrix}\right.
$$
然后我们会可以把阶乘\(n(n - 1)(n - 2)...(n - k + 1)\)当成一个k次多项式

然后暴力算出每一项的系数,然后我们要算的就是

\(\sum_{i = l}^{r} f_{i}^{k}\)

然后把通项带进去

\(\sum_{i = l}^{r} (c_{1}x_{1}^{i} + c_{2}x_{2}^{i})^{k}\)

\(\sum_{i = l}^{r}\sum_{j = 0}^{k}\binom{k}{j}c_{1}^{j}x_{1}^{ij}c_{2}^{k - j}x_{2}^{i(k - j)}\)

\(\sum_{j = 0}^{k}\binom{k}{j}c_{1}^{j}c_{2}^{k - j}\sum_{i = l}^{r}(x_{1}^{j}x_{2}^{k - j})^{i}\)

后面是等比数列求和,算一下就好了

复杂度是\(k^{2}\log r\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 2005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
const int MOD = 998244353;
int inc(int a,int b) {
    return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
    return 1LL * a * b % MOD;
}
void update(int &x,int y) {
    x = inc(x,y);
}
int fpow(int x,int c) {
    int res = 1,t = x;
    while(c) {
    if(c & 1) res = mul(res,t);
    t = mul(t,t);
    c >>= 1;
    }
    return res;
}
template<int T>
struct Complex {
    int r,i;
    Complex(int _r = 0,int _i = 0) {r = _r;i = _i;}
    friend Complex operator + (const Complex &a,const Complex &b) {
    return Complex(inc(a.r,b.r),inc(a.i,b.i));
    }
    friend Complex operator - (const Complex &a,const Complex &b) {
    return Complex(inc(a.r,MOD - b.r),inc(a.i,MOD - b.i));
    }
    friend Complex operator * (const Complex &a,const Complex &b) {
    return Complex(inc(mul(a.r,b.r),mul(T,mul(a.i,b.i))),inc(mul(a.r,b.i),mul(b.r,a.i)));
    }
    friend Complex fpow(Complex x,int64 c) {
    Complex res(1,0),t = x;
    while(c) {
        if(c & 1) res = res * t;
        t = t * t;
        c >>= 1;
    }
    return res;
    }
    friend Complex Query(Complex x,int64 n) {
    if(x.r == 1 && !x.i) return (n + 1)% MOD;
    Complex u = 1 - fpow(x,n + 1),d = 1 - x,t;
    t = d;t.i = MOD - t.i;
    int iv = fpow((t * d).r,MOD - 2);
    u = u * t * iv;
    return u;
    }
};
int m,k,f[1005],fac[1005],invfac[1005];
int64 l,r;
int C(int n,int m) {
    if(n < m) return 0;
    return mul(fac[n],mul(invfac[m],invfac[n - m]));
}
namespace mequal2 {
    Complex<5> x1,x2,c1,c2;
    void Main() {
    int inv2 = fpow(2,MOD - 2),inv10 = fpow(10,MOD - 2);
    x1 = Complex<5>(inv2,inv2);x2 = Complex<5>(inv2,MOD - inv2);
    c1 = Complex<5>(mul(5,inv10),inv10);c2 = Complex<5>(mul(5,inv10),MOD - inv10);
    int ans = mul(invfac[k],fpow((r - l + 1) % MOD,MOD - 2));
    Complex<5> res;
    for(int j = 1 ; j <= k ; ++j) {
        Complex<5> s;
        for(int h = 0 ; h <= j ; ++h) {
        Complex<5> t = C(j,h) * fpow(c1,h) * fpow(c2,j - h),q = fpow(x1,h) * fpow(x2,j - h),p;
        p = Query(q,r) - Query(q,l - 1);
        s = s + t * p;
        }
        res = res + s * f[j];
    }
    ans = mul(ans,res.r);
    out(ans);enter;
    }
}
namespace mequal3 {
    Complex<3> x1,x2,c1,c2;
    void Main() {
    int inv6 = fpow(6,MOD - 2);
    x1 = Complex<3>(2,1);x2 = Complex<3>(2,MOD - 1);
    c1 = Complex<3>(mul(3,inv6),inv6);c2 = Complex<3>(mul(3,inv6),MOD - inv6);
    int ans = mul(invfac[k],fpow((r - l + 1) % MOD,MOD - 2));
    r = r / 2;
    if(l & 1) l = (l + 1) / 2;
    else l = l / 2;
    
    Complex<3> res;
    if(l <= r) {
        for(int j = 1 ; j <= k ; ++j) {
        Complex<3> s;
        for(int h = 0 ; h <= j ; ++h) {
            Complex<3> t = C(j,h) * fpow(c1,h) * fpow(c2,j - h),q = fpow(x1,h) * fpow(x2,j - h),p;
            p = Query(q,r) - Query(q,l - 1);
            s = s + t * p;
        }
        res = res + s * f[j];
        }
    }
    ans = mul(ans,res.r);
    out(ans);enter;
    }
}
void Solve() {
    read(l);read(r);read(k);
    memset(f,0,sizeof(f));
    f[1] = 1;
    for(int i = 1 ; i < k ; ++i) {
    for(int j = i + 1 ; j >= 1 ; --j) {
        f[j] = inc(mul(MOD - i,f[j]),f[j - 1]);
    }
    }
    if(m == 2) mequal2::Main();
    else mequal3::Main();
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    int T;
    read(T);read(m);
    fac[0] = 1;
    for(int i = 1 ; i <= 1000 ; ++i) fac[i] = mul(fac[i - 1],i);
    invfac[1000] = fpow(fac[1000],MOD - 2);
    for(int i = 999 ; i >= 0 ; --i) invfac[i] = mul(invfac[i + 1],i + 1);
    for(int i = 1 ; i <= T ; ++i) {
    Solve();
    }
}

转载于:https://www.cnblogs.com/ivorysi/p/10984467.html

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
<think>我们正在处理一个Simulink编译错误,错误信息是“lccmake don&#39;t know how to make target”。这个错误通常发生在使用LCC编译器(MATLAB自带的一个C编译器)时,Simulink尝试编译模型或自定义代码时找不到指定的目标文件或规则。 ### 错误原因分析 1. **编译器问题**:LCC编译器可能未正确安装或配置。MATLAB自带的LCC编译器通常用于Windows平台,如果安装不完整或者路径设置有问题,会导致编译失败。 2. **自定义代码问题**:如果模型中包含自定义的C/C++代码(例如S-function),而代码中存在语法错误、依赖缺失或路径问题,编译器无法生成目标文件。 3. **文件路径问题**:自定义代码文件没有包含在MATLAB路径中,或者文件路径包含空格或特殊字符,导致编译器无法找到源文件。 4. **目标文件缺失**:编译过程中需要生成中间目标文件(.obj),如果这些文件缺失或损坏,也会导致此错误。 ### 解决步骤 #### 步骤1:检查编译器配置 在MATLAB命令窗口中输入: ```matlab mex -setup ``` 确保选择了LCC编译器(如果可用)。如果未检测到LCC,可能需要重新安装MATLAB或修复安装。 #### 步骤2:检查自定义代码 - 确保自定义代码(.c/.cpp文件)没有语法错误,可以在其他编译器中先测试。 - 确保自定义代码中包含了必要的头文件,特别是Simulink生成的`rtwtypes.h`和`simstruc.h`。 #### 步骤3:添加文件路径 在MATLAB命令窗口中,将自定义代码所在目录添加到MATLAB路径: ```matlab addpath(&#39;你的自定义代码目录&#39;); ``` 或者通过“设置路径”对话框添加。 #### 步骤4:避免路径中的空格和特殊字符 确保模型文件、自定义代码文件以及输出目录的路径中不包含空格或特殊字符(如中文、括号等)。建议使用全英文路径。 #### 步骤5:清理并重新编译 有时中间文件会导致问题,尝试清理并重新编译: 1. 在Simulink中,选择菜单:**Simulation > Update Diagram**(或按Ctrl+D)更新模型。 2. 如果使用S-Function,尝试重新编译S-Function:在命令窗口使用`mex your_sfunction.c`重新编译。 3. 如果问题仍然存在,尝试清除所有生成的代码:在Simulink中,选择**Simulation > Run > Clean build**(具体选项可能因版本而异)。 #### 步骤6:更换编译器 如果上述步骤无效,考虑更换为其他支持的编译器(如Microsoft Visual C++)。在MATLAB中运行: ```matlab mex -setup -v ``` 查看可用的编译器列表,并选择安装好的编译器。然后重新编译模型。 ### 引用分析 在引用[3]中提到,编译内核时由于配置问题导致错误,通过调整配置(如去掉APCI选项)解决了问题。类似地,在Simulink编译中,也可能是编译器配置问题,需要调整编译选项或更换编译器。 引用[4]提到关闭CPU变频控制(Power management options)解决了编译问题。这提示我们,有时系统环境设置(如电源管理)可能会影响编译过程。虽然这与Simulink编译错误没有直接关联,但可以检查系统环境是否稳定(例如关闭不必要的后台程序)。 ### 相关问题 §§相关问题§§ 1. 如何配置MATLAB使用其他编译器(如Visual Studio)? 2. Simulink编译自定义代码时出现“undefined reference”错误如何解决? 3. 如何调试Simulink中的S-Function?</think>### 修复Simulink编译错误:"lccmake don&#39;t know how to make target" #### 错误原因分析 该错误通常由以下原因导致: 1. **编译器配置问题**:MATLAB自带的LCC编译器未正确配置或路径丢失 2. **自定义代码路径问题**:Simulink找不到自定义C/C++代码文件 3. **环境变量冲突**:系统环境变量与MATLAB编译器设置冲突 4. **编译器兼容性问题**:自定义代码使用了LCC不支持的语法或特性 #### 解决方案步骤 ##### 1. 验证编译器配置 在MATLAB命令行执行: ```matlab mex -setup ``` 检查LCC编译器是否被正确识别。若无输出或报错,需重新配置编译器: ```matlab cd(fullfile(matlabroot,&#39;bin&#39;,&#39;win64&#39;)) mex -setup -regserver ``` ##### 2. 添加自定义代码路径 在模型属性中显式添加路径: ```matlab % 在模型初始化回调(InitFcn)中添加: addpath(&#39;你的自定义代码路径&#39;); set_param(gcs,&#39;CustomInclude&#39;,&#39;你的头文件路径&#39;); set_param(gcs,&#39;CustomSource&#39;,&#39;你的源文件路径&#39;); ``` ##### 3. 检查环境变量冲突 在Windows系统中: 1. 打开系统属性 > 环境变量 2. 检查`PATH`变量中是否包含其他C编译器路径(如MinGW或Visual Studio) 3. 临时移除冲突路径后重启MATLAB ##### 4. 编译器兼容性处理 若自定义代码使用C++特性: ```matlab % 在模型配置参数中指定C++编译: set_param(bdroot,&#39;TargetLang&#39;,&#39;C++&#39;) ``` 或显式指定编译器选项: ```matlab mex -O -c custom_code.c COMPFLAGS="$COMPFLAGS /std:c99" ``` ##### 5. 完整重建流程 ```matlab % 步骤1:清除编译缓存 bdclose all slbuild(&#39;clearall&#39;) % 步骤2:设置编译环境 set_param(0,&#39;CompilerConfiguration&#39;,&#39;LCC&#39;) set_param(0,&#39;GenCodeOnly&#39;,&#39;off&#39;) % 步骤3:强制重新编译 rtwbuild(&#39;your_model_name&#39;,&#39;ForceBuild&#39;,&#39;on&#39;) ``` #### 关键配置检查点 | 配置项 | 推荐值 | 检查命令 | |-------------------------|----------------------------|--------------------------| | 编译器选择 | LCC-win64 v2.4.1 | `mex.getCompilerConfigurations` | | 自定义代码路径 | 绝对路径无空格 | `get_param(gcs,&#39;CustomSource&#39;)` | | 语言标准 | C99/C++03 | `mex -v` 查看编译标志 | | 头文件包含 | 完整路径声明 | 检查`#include`语句 | #### 替代方案 如问题持续存在,考虑: 1. **更换编译器**:安装[MATLAB支持的编译器](https://www.mathworks.com/support/requirements/supported-compilers.html) ```matlab mex -setup C++ ``` 2. **使用S-Function包装器**:将自定义代码封装为S-Function ```matlab legacy_code(&#39;sfcn_cmex_generate&#39;,&#39;your_sfun&#39;) ``` > **注意**:编译环境冲突是此类错误的常见原因。引用[3]和[4]提到编译内核时因配置冲突导致文件系统错误,与编译器配置问题类似,都需要确保环境纯净性[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值