FZU 1692 Key problem

本文详细解析了FZU_1692问题的解决方法,重点介绍了通过矩阵运算进行常数优化的技术手段。文章中不仅展示了如何利用矩阵的循环同构性质来降低计算复杂度,还提供了具体的C++代码实现。

FZU_1692

    首先感觉输入数据里面的L和R应该反过来读取即先读入R再读入L,要不然样例算不出来,不知道是不是我理解错题意了。

    矩阵不难构造,但这个题让进一步注意到了矩阵运算中的常熟优化:

    ①由于递推关系的矩阵各行是循环同构的,而两个这样的循环同构的矩阵的乘积依然是循环同构的,所以在用二分矩阵的方法计算的时候,可以先用O(N^2)的时间计算出第一行,再用O(N^2)的时间平移出下面各行的结果,这样每次做乘法的复杂度就由O(N^3)减少到了O(N^2)。

    ②矩阵乘法的multiply的函数最好使用引用传递传参,如果直接传参的话每次相当于把矩阵复制一遍,这样效率就比较低了。

#include<stdio.h>
#include<string.h>
#define MAXD 110
int N, M, L, R, D, a[MAXD];
struct Matrix
{
    int a[MAXD][MAXD];
    Matrix()
    {
        memset(a, 0, sizeof(a));
    }
    void init()
    {
        int i, j;
        for(i = 0; i < N; i ++)
            a[i][(i + N - 1) % N] = L, a[i][i] = 1, a[i][(i + 1) % N] = R;
    }
};
Matrix multiply(Matrix &x, Matrix &y)
{
    int i, j, k;
    Matrix z;
    for(k = 0; k < N; k ++)
        if(x.a[0][k])
        {
            for(j = 0; j < N; j ++)
                if(y.a[k][j])
            z.a[0][j] = (z.a[0][j] + (long long)x.a[0][k] * y.a[k][j]) % D;
        }
    for(i = 1; i < N; i ++)
    {
        z.a[i][0] = z.a[i - 1][N - 1];
        for(j = 1; j < N; j ++)
            z.a[i][j] = z.a[i - 1][j - 1];
    }
    return z;
}
Matrix powmod(Matrix unit, Matrix mat, int n)
{
    while(n)
    {
        if(n & 1)
            unit = multiply(mat, unit);
        n >>= 1;
        mat = multiply(mat, mat);
    }
    return unit;
}
void solve()
{
    int i, j, ans;
    Matrix unit, mat;
    scanf("%d%d%d%d%d", &N, &M, &R, &L, &D);
    for(i = 0; i < N; i ++)
    {
        scanf("%d", &a[i]);
        unit.a[i][i] = 1;
    }
    mat.init();
    unit = powmod(unit, mat, M);
    for(i = 0; i < N; i ++)
    {
        ans = 0;
        for(j = 0; j < N; j ++)
            if(unit.a[i][j] && a[j])
                ans = (ans + (long long)unit.a[i][j] * a[j]) % D;
        if(i)
            printf(" ");
        printf("%d", ans);
    }
    printf("\n");
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t --)
    {
        solve();
    }
    return 0;
}
多角色体系 支持管理员、商家、消费者三种角色,权限分级管控: 管理员:负责平台整体配置、用户审核、数据监控等全局操作。 商家:管理店铺信息、发布商品、处理订单、回复评价等。 消费者:浏览商品、加入购物车、下单支、评价商品等。 实现用户注册(手机号 / 邮箱验证)、登录(支持密码 / 验证码 / 第三方登录)、个人信息管理(头像、收货地址、密码修改)。 权限精细化控制 商家仅能管理自家店铺及商品,消费者仅能查看和购买商品,管理员拥有全平台数据访问权限。 二、商品管理功能 商品信息维护 商家可发布商品:填写名称、分类(如服饰、电子产品)、子类别(如手机、笔记本)、规格(尺寸、颜色、型号)、价格、库存、详情描述(图文)、物流信息(运费、发货地)等。 支持商品上下架、库存调整、信息编辑,系统自动记录商品状态变更日志。 商品分类与搜索 按多级分类展示商品(如 “数码产品→手机→智能手机”),支持自定义分类体系。 提供智能搜索功能:按关键词(名称、品)搜索,支持模糊匹配和搜索联想;结合用户浏览历史对搜索结果排序(优先展示高相关度商品)。 商品推荐 基于用户浏览、收藏、购买记录,推荐相似商品(如 “浏览过该商品的用户还买了…”)。 首页展示热门商品(销量 TOP10)、品上架、限时折扣等推荐列表。 三、订单与交易管理 购物车与下单 消费者可将商品加入购物车,支持修改数量、选择规格、移除商品,系统自动计算总价(含运费、折扣)。 下单流程:确认收货地址→选择支方式(在线支、货到款)→提交订单→系统生成唯一订单号。 订单处理流程 订单状态跟踪:待支→已支→商家发货→物流运输→消费者收货→订单完成,各状态变更实时通知用户。 商家端功能:查看订单提醒、确认发货(填写物流单号)、处理退款申请(需审核理由)。 消费者端功能:查看订单详情、追踪物流、申请退款 / 退货、确认收货。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值