当前位置: 首页 > news >正文

FZU 1692 Key problem (构造矩阵)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1692

题意:n个小孩围城一圈,开始每个人有ai个苹果。接下来进行m轮分苹果。第t个人第i轮分得的苹果为R*x+L*y+z。x为第t左边的人上一次的苹果数,y为第t个人右边的人上一次的苹果数,z为第t个人本身拥有的苹果数。求m轮后每个人的苹果数。

思路:利用循环性,每次矩阵乘法的复杂度为O(n^2)。下面是一组测试数据计算初始矩阵(第一个矩阵)的1,2,3,4,5次方后的矩阵:

 

1 3 0 0 4
4 1 3 0 0
0 4 1 3 0
0 0 4 1 3
3 0 0 4 1

 

25 6 9 16 8
8 25 6 9 16
16 8 25 6 9
9 16 8 25 6
6 9 16 8 25

 

73 117 91 75 156
156 73 117 91 75
75 156 73 117 91
91 75 156 73 117
117 91 75 156 73

 

1009 700 742 972 673
673 1009 700 742 972
972 673 1009 700 742
742 972 673 1009 700
700 742 972 673 1009

 

int n,mod;

class Matrix
{
public:
    int a[N][N];

    void init(int x)
    {
        int i;
        if(!x) clr(a,0);
        else
        {
            clr(a,0);
            FOR0(i,N) a[i][i]=1;
        }
    }

    Matrix operator*(Matrix b)
    {
        int i,j,k,t;
        Matrix p;
        p.init(0);
        FOR0(i,n) FOR0(k,n)
        {
            (p.a[0][i]+=(i64)a[0][k]*b.a[k][i]%mod)%=mod;
        }
        FOR1(i,n-1) FOR0(j,n)
        {
            p.a[i][j]=p.a[i-1][(j+n-1)%n];
        }
        return p;
    }

    Matrix power(int t)
    {
        Matrix ans,p=*this;
        ans.init(1);
        while(t)
        {
            if(t&1) ans=ans*p;
            p=p*p;
            t>>=1;
        }
        return ans;
    }

    void print()
    {
        int i,j;
        FOR0(i,n)
        {
            FOR0(j,n) printf("%d ",a[i][j]);
            puts("");
        }
    }
};

Matrix a;
int m,L,R;
int data[N];

int main()
{
    rush()
    {
        RD(n,m);
        RD(L,R,mod);
        int i,l,r;
        a.init(1);
        FOR0(i,n)
        {
            l=(i+1)%n;
            r=(i+n-1)%n;
            a.a[i][i]=1;
            a.a[i][l]+=L%mod;
            a.a[i][r]+=R%mod;
        }
        a=a.power(m);
        FOR0(i,n) RD(data[i]);
        i64 ans,j;
        FOR0(i,n)
        {
            ans=0;
            FOR0(j,n) (ans+=(i64)a.a[i][j]*data[j]%mod)%=mod;
            printf("%d",ans);
            if(i<n-1) putchar(' ');
        }
        puts("");
    }
    return 0;
}

  

相关文章:

  • 【分享】通过Excel生成批量SQL语句,处理大量数据的好办法
  • SGU 122 The book(构造)
  • 全局dialog,在小米4及部分机型上不能正常弹出
  • DOM常用操作
  • docker学习笔记7:发布镜像到docker hub上
  • Java通过wait()和notifyAll()方法实现线程间的通信
  • Ado.NET SQLHelper
  • ubuntu14.04 忘记root密码
  • 神奇语言python文件操作
  • Microsoft SQL Server登陆Linux
  • VSCode Python开发环境配置
  • 企业是怎么给MYSQL赋予用户权限
  • mongoDB 删除集合后,空间不释放
  • mysql分页(ajax)
  • BZOJ 1565 植物大战僵尸(最大权闭合图)
  • [LeetCode] Wiggle Sort
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Android组件 - 收藏集 - 掘金
  • canvas 绘制双线技巧
  • JS数组方法汇总
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql 5.6 原生Online DDL解析
  • Redux 中间件分析
  • SAP云平台里Global Account和Sub Account的关系
  • Sublime text 3 3103 注册码
  • 看域名解析域名安全对SEO的影响
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 再次简单明了总结flex布局,一看就懂...
  • k8s使用glusterfs实现动态持久化存储
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 组复制官方翻译九、Group Replication Technical Details
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $refs 、$nextTic、动态组件、name的使用
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (二)Eureka服务搭建,服务注册,服务发现
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NetCore部署微服务(二)
  • @GlobalLock注解作用与原理解析
  • [《百万宝贝》观后]To be or not to be?
  • [AIGC] Spring Interceptor 拦截器详解
  • [APIO2015]巴厘岛的雕塑
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [HAOI2016]食物链
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [Leetcode] Permutations II
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [NHibernate]一对多关系(关联查询)
  • [POJ3067]Japan
  • [vivado系列]Vivado软件的下载
  • [Wap]OnViewStateExpire异常的处理办法