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. pip各种

    pip: 一个现代的,通用的 Python 包管理工具.提供了对Python 包的查找.下载.安装.卸载的功能. windows:自带pip,直接使用. Linux:执行下面命令即可完成安装. # w ...

  2. mysql-5.7.17-winx64免安装配置

    一,下载mysql-5.7.17-winx64.zip 地址:https://dev.mysql.com/downloads/file/?id=467269 二,解压到自己的某个磁盘:data文件夹和 ...

  3. 编程数学(A-1)-(B-1)-一个数的负次方怎么算

    一个数的负几次方就是这个数的几次方的倒数.当这个数是正整数时,也就是说一个数的负n次方就是这个数的n次方分之一.例如: 2的-2次方=2的2次方分之1=4分之13的-2次方=3的2次方分之1=9分之1 ...

  4. 怎样签发SSL证书

    最近在做怎样让网站有SSL,搞了一天,现在总结一下 首先要安装OPENSSL和 Java的 keytool 先用OPENSSL生成私钥和CSR openssl req -newkey rsa:2048 ...

  5. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  6. Ubuntu 16.04安装7zip的图形界面工具PeaZip

    其实PeaZip不是7zip的图形界面工具,而是一整套方案,里面包括了7z格式的解压缩等. PeaZip Linux版本只有32位包,如果你使用的是64位Ubuntu系统,那么先打开终端运行下面的命令 ...

  7. oracle索引简单使用

    --查询表索引 select * from user_ind_columns where table_name = upper('HY_PROJECT') and column_name = uppe ...

  8. CentOS command

    管理centos服务器的时候常会对文件进行一些常规操作,除了ftp之外了解在ssh下必要的文件操作命令那也是必不可少的,以下摘录一些常用的文件操作命令: 文件操作: ls ####查看目录中的文件## ...

  9. IE網址欄快速輸入網址,“Ctrl+Enter”補齊“.com”

    繁體中文Windows,預設 IE 在網址列輸入 abc,然後按 Ctrl+Enter ,會跳到www.abc.com.tw, 但較常用的連結是www.abc.com,如何修改这一設定呢? 可以透過修 ...

  10. 手动安装Firefox Linux

    (2015-06-05 17:22:19)[编辑][删除] 转载▼ 标签: 股票 Firefox 下载文件以.tar和.bz2格式保存,必须从这些压缩包中提取文件.不想删除当前安装的 Firefox, ...