刷题比赛

题目描述

给你四个数组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%分了.

posted @ 2017-08-07 16:02  Iamhx  阅读(146)  评论(0编辑  收藏  举报