• 刷题比赛


    题目描述

    给你四个数组A,B,C,D. 给出每个数组的初始值A[1] = 1, B[1] = 1, C[1] = 1, D[1] =1 , A[2] = 3, B[2] = 3, C[2] = 3, D[2] = 3;
    有以下的递推公式:
    (1) a[k+2]=p* a[k+1]+qa[k]+b[k+1]+c[k+1]+r k^2+t * k+1+d[k];
    (2)b[k+2]=u* b[k+1]+vb[k]+a[k+1]+c[k+1]+w^k+d[k];
    (3)c[k+2]=x
    c[k+1]+yc[k]+a[k+1]+b[k+1]+z ^ k+k+2+d[k];
    (4)d[k+2]=e
    d[k+1]+f*d[k];
    (以上的字母p,q,r,t,u,v,w,x,y,z,e,f都是给定的常数,并保证是正整数)
    由于结果很大,输出a[k] mod k,b[n] mod k,c[n] mod k, d[n] mod k;(4<=n<=10^12)

    输入格式:

    第一行两个正整数N,K。(4<=N<=1012,2<=K<=1016)
    第二行四个正整数p,q,r,t。
    第三行三个正整数u,v,w。
    第四行三个正整数x,y,z。
    第五行两个正整数e,f.
    (保证p,q,r,t,u,v,w,x,y,z,e,f都是不超过100的正整数)

    输出格式:

    共三行,每行一个整数。依次是这四个数组 mod K的值。

    输入样例#1:

    输出样例#1:

    说明

    矩阵乘法。

    注意,中间相乘过程可能会比64位长整型的数据范围还要大。

    solution

    20%的做法:

    按照题目给出的式子直接模拟计算即可

    60%的做法:

    运用矩阵快速幂,我们需要构造出一个合格的答案矩阵和一个合格的转移矩阵.
    经过一番推演后可以得到一个13 * 13的转移矩阵
    0 1 0 0 0 0 0 0 0 0 0 0 0 ak
    q p 0 1 0 1 1 0 r t 1 0 0 ak+1
    0 0 0 1 0 0 0 0 0 0 0 0 0 bk
    0 1 v u 0 1 1 0 0 0 0 1 0 bk+1
    0 0 0 0 0 1 0 0 0 0 0 0 0 ck
    0 1 0 1 y x 1 0 0 1 2 0 1 ck+1
    0 0 0 0 0 0 0 1 0 0 0 0 0 dk
    0 0 0 0 0 0 f e 0 0 0 0 0 dk+1
    0 0 0 0 0 0 0 0 1 2 1 0 0 k^2
    0 0 0 0 0 0 0 0 0 1 1 0 0 k(初始值为1)
    0 0 0 0 0 0 0 0 0 0 1 0 0 1(恒为一)
    0 0 0 0 0 0 0 0 0 0 0 w 0 w^k (初始值为w)
    0 0 0 0 0 0 0 0 0 0 0 0 z z^k (初始值为z)
    对这两个矩阵进行n-2次快速幂即可(当然,右边的矩阵要填上一堆0,使得这个矩阵也成为13*13的规模). (只能得60分是因为其他的点乘法运算会爆longlong)
    对于65%的做法,我们把60%程序中的longlong 改为unsigned long long 即可得65分

    100%的做法:

    100%的做法是在60%的做法上面进行改进的,因为中途运算会爆longlong,所以我们在矩阵乘法的时候不能使用单纯的乘法,应该用快速幂加法来代替乘法.
    这样就可以得100%分了.

  • 相关阅读:
    图片服务器的搭建
    Nginx的安装和部署
    Zookeeper安装和部署
    集合框架
    案例-学生成绩管理
    java 时间类
    Java 正则表达式
    Java字符串
    Java学生管理系统
    shell实例利用crontab自动清除日志
  • 原文地址:https://www.cnblogs.com/juruohx/p/7299595.html
Copyright © 2020-2023  润新知