矩阵快速幂(校赛)

本文介绍了一种使用快速幂方法解决特定形式的递推数列问题的方法,并提供了一个C++实现示例。该方法适用于求解形如F[n]=A*F[n-1]+B*F[n-2]+C*(n+1)*(n-2)的大规模数值问题。

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

题目描述:
天外天非常喜欢数列,现在averyboy给了天外天一个数列:F[n] = A * F[n - 1] + B * F[n - 2] + C * (n + 1) * (n - 2)(n >= 3)
其中F[1] = 1, F[2] = 2, 现在天外天把这个问题给你,对于给定N, A, B, C,你需要输出F[N], 因为答案很大,所以你需要对1000000007
取模。
输入描述:
第一行一个整数T,表示测试数据的组数。(T <= 100)
接下来T组测试数据,每组包括四个整数N, A, B, C;(N <= 1e18, A, B, C <= 1e5)
输出描述:
一个整数,F[N]对1000000007取模
样例输入:
4
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
样例输出:
Case #:1 1
Case #:2 2
Case #:3 7
Case #:4 19

第一次做快速幂的题

感觉就是从f(n-1)凑到f(n);



代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const LL Mod = 1e9+7;
LL n,a,b,c;
struct ma
{
    LL m[5][5];
    ma()
    {
        memset(m,0,sizeof(m));
    }
};
ma mul(ma a,ma b)
{
    ma c;
    for(int i = 0;i < 5;i++)
        for(int j = 0;j < 5;j++)
        for(int k = 0;k < 5;k++)
        {
            c.m[i][j] += a.m[i][k]*b.m[k][j];
            if(c.m[i][j] < 0)
                c.m[i][j] = (c.m[i][j] + Mod) % Mod;
            c.m[i][j] = c.m[i][j] % Mod;
        }
    return c;
}
ma pow(ma a,LL n)
{
    ma c;
    for(int i = 0;i < 5;i++)
        c.m[i][i] = 1;
    while(n)
    {
        if(n&1)
            c = mul(c,a);
        n >>= 1;
        a = mul(a,a);
    }
    return c;
}
 int main()
 {
     freopen("C:\\Users\\hasee\\Desktop\\比赛\\题目\\F\\in.txt","r",stdin);
     freopen("C:\\Users\\hasee\\Desktop\\比赛\\题目\\F\\out1.txt","w",stdout);
     int T;
     scanf("%d",&T);
     int num = 1;
     while(T--)
     {
         scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
         if(n == 1)
            printf("Case #:%d 1\n",num++);
         else if(n == 2)
            printf("Case #:%d 2\n",num++);
         else if(n == 3)
            printf("Case #:%d %lld\n",num++,(2*a + b + 4*c) % Mod);
         else
         {
             LL x1 = (2*a + b + 4*c) % Mod;
             ma m1,m2;
             m1.m[0][0] = a;
             m1.m[0][1] = b;
             m1.m[0][2] = c;
             m1.m[0][3] = 0;
             m1.m[1][0] = m1.m[2][2] = m1.m[2][3] = m1.m[3][3] = m1.m[3][4] = m1.m[4][4] = 1;
             m2.m[0][0] = x1;
             //cout<<"x1:"<<x1<<endl;
             m2.m[1][0] = 2;
             m2.m[2][0] = 10;
             m2.m[3][0] = 8;
             m2.m[4][0] = 2;
             m1 = pow(m1,n-3);
             m2 = mul(m1,m2);
             printf("Case #:%d %lld\n",num++,m2.m[0][0]);
         }
     }
     return 0;
 }

内容概要:该论文研究增程式电动汽车(REEV)的能量管理策略,针对现有优化策略实时性差的问题,提出基于工况识别的自适应等效燃油消耗最小策略(A-ECMS)。首先建立整车Simulink模型和基于规则的策略;然后研究动态规划(DP)算法和等效燃油最小策略;接着通过聚类分析将道路工况分为四类,并设计工况识别算法;最后开发基于工况识别的A-ECMS,通过高德地图预判工况类型并自适应调整SOC分配。仿真显示该策略比规则策略节油8%,比简单SOC规划策略节油2%,并通过硬件在环实验验证了实时可行性。 适合人群:具备一定编程基础,特别是对电动汽车能量管理策略有兴趣的研发人员和技术爱好者。 使用场景及目标:①理解增程式电动汽车能量管理策略的基本原理;②掌握动态规划算法和等效燃油消耗最小策略的应用;③学习工况识别算法的设计和实现;④了解基于工况识别的A-ECMS策略的具体实现及其优化效果。 其他说明:此资源不仅提供了详细的MATLAB/Simulink代码实现,还深入分析了各算法的原理和应用场景,适合用于学术研究和工业实践。在学习过程中,建议结合代码调试和实际数据进行实践,以便更好地理解策略的优化效果。此外,论文还探讨了未来的研究方向,如深度学习替代聚类、多目标优化以及V2X集成等,为后续研究提供了思路。
内容概要:论文《基于KANN-DBSCAN带宽优化的核密度估计载荷谱外推》针对传统核密度估计(KDE)载荷外推中使用全局固定带宽的局限性,提出了一种基于改进的K平均最近邻DBSCAN(KANN-DBSCAN)聚类算法优化带宽选择的核密度估计方法。该方法通过对载荷数据进行KANN-DBSCAN聚类分组,采用拇指法(ROT)计算各簇最优带宽,再进行核密度估计和蒙特卡洛模拟外推。实验以电动汽车实测载荷数据为对象,通过统计参数、拟合度和伪损伤三个指标验证了该方法的有效性,误差显著降低,拟合度R²>0.99,伪损伤接近1。 适合人群:具备一定编程基础和载荷数据分析经验的研究人员、工程师,尤其是从事汽车工程、机械工程等领域的工作1-5年研发人员。 使用场景及目标:①用于电动汽车载荷谱编制,提高载荷预测的准确性;②应用于机械零部件的载荷外推,特别是非对称载荷分布和多峰扭矩载荷;③实现智能网联汽车载荷预测与数字孪生集成,提供动态更新的载荷预测系统。 其他说明:该方法不仅解决了传统KDE方法在复杂工况下的“过平滑”与“欠拟合”问题,还通过自适应参数机制提高了方法的普适性和计算效率。实际应用中,建议结合MATLAB代码实现,确保数据质量,优化参数并通过伪损伤误差等指标进行验证。此外,该方法可扩展至风电装备、航空结构健康监测等多个领域,未来研究方向包括高维载荷扩展、实时外推和多物理场耦合等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值