https://vjudge.net/problem/UVALive-3704

参考:http://www.cnblogs.com/iwtwiioi/p/3946211.html

循环矩阵。。。

我们发现,这道题n^3logk过不了 那么就要用循环矩阵

矩阵乘法:a[i][j]=b[i][k]*c[k][j]

列向量的复杂度是O(n^2),因为只有一列,每次列向量和系数矩阵里的值对应乘起来就可以了,每次O(n),做n次。

但是系数矩阵自乘的复杂度就是O(n^3),也就意味着我们要优化系数矩阵的自乘。

我们发现,系数矩阵是一个循环矩阵。。。

也就是说系数矩阵的每一行都是上一行平移一位。

那么也就是说我们只用求第一行就可以了。

这里说明一下我们只优化了系数矩阵的自乘,没有优化快速幂中求答案的那一部分。

其实,循环矩阵的行和列是对应相等的,第一行=第一列,第二行=第二列,也就是说自乘的时候第二个元素=第一行*第二列=第一行*第二行,那么只用保存第一行就行了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
struct mat {
ll a[N];
} x, a, b;
int n, m, d, k;
mat operator * (mat A, mat B)
{
mat ret; memset(ret.a, , sizeof(ret.a));
for(int i = ; i < n; ++i)
for(int j = ; j < n; ++j)
if(i - j >= ) ret.a[i] = (ret.a[i] + A.a[j] * B.a[i - j]) % m;
else ret.a[i] = (ret.a[i] + A.a[j] * B.a[i - j + n]) % m;
return ret;
}
int main()
{
while(scanf("%d%d%d%d", &n, &m, &d, &k) != EOF)
{
memset(a.a, , sizeof(a.a));
memset(b.a, , sizeof(b.a));
for(int i = ; i < n; ++i) scanf("%lld", &x.a[i]);
for(int i = ; i <= d; ++i) a.a[i] = ;
for(int i = n - ; i >= n - d; --i) a.a[i] = ;
b.a[] = ;
for(; k; a = a * a, k >>= ) if(k & ) b = b * a;
x = b * x;
for(int i = ; i < n - ; ++i) printf("%lld ", x.a[i] % m);
printf("%lld\n", x.a[n - ] % m);
}
return ;
}

LA3704的更多相关文章

随机推荐

  1. jsp include html 乱码问题解决

    方法一: 在被包含的html中,在首行加上 <%@ page language="java" import="java.util.*" pageEncod ...

  2. 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)

    读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...

  3. 86-Money Flow Index 资金流量指数指标.(2015.7.3)

    Money Flow Index 资金流量指数指标 计算: 1.典型价格(TP)=当日最高价.最低价与收盘价的算术平均值 2.货币流量(MF)=典型价格(TP)×N日内成交金额 3.如果当日MF> ...

  4. 02--Activiti初始化表

    初始化数据库 方法一:执行sql脚本文件activiti-5.13\database\create\activiti.mysql.create.*.sql文件 方法二:代码创建(有流程自然就有表) p ...

  5. android 的Manifest对图标的影响

    转自 http://blog.csdn.net/yuan1590/article/details/6700683 先看看网路上的说法: Android.intent.action.MAIN决定应用程序 ...

  6. codeforces 362B

    #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int ...

  7. Django:(4)Django和Ajax

    向服务器发送请求的途径: 1. 浏览器地址栏,默认get请求 2. form表单: get请求: post请求 3. a标签,默认get请求 4. Ajax:get请求:post请求 Ajax的特点( ...

  8. Spring Boot Jpa 表名小写转大写

    今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和  AC ...

  9. Codeforces 645A Amity Assessment【八数码】

    题目链接: http://codeforces.com/problemset/problem/645/A 题意: 2*2的八数码问题 分析: 这题n为2,不需要搜索,直接判断字母排列顺序就好了. 注意 ...

  10. [bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

    队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. ...