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. java程序调用bat脚本

    运用Java程序控制某个应用程序的运行(以网易云音乐为例),步骤如下 1.建立bat文件分别是start.bat(控制程序的运行)和kill.bat(控制程序的结束): start.bat 的内容如下 ...

  2. [codeforces494B]Obsessive String

    [codeforces494B]Obsessive String 试题描述 Hamed has recently found a string t and suddenly became quite ...

  3. [luoguP1494] 岳麓山上打水 && [luoguP2744] [USACO5.3]量取牛奶Milk Measuring

    传送门 传送门 dfs选取集合,dp背包判断 虽然我觉的会TLE.. 但是的确是AC了 #include <cstdio> #include <cstring> #includ ...

  4. HUST 1407(数据结构)

    1407 - 郁闷的小J 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所 ...

  5. webview的设置

    设置支持js: webView.getSettings().setJavaScriptEnabled(true); 设置无图模式: webView.getSettings().setBlockNetw ...

  6. Codeforces Round #489 (Div. 2) B、C

    B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...

  7. lines-HDU5124(区间处理 +离散化)

    Problem Description John has several lines. The lines are covered on the X axis. Let A is a point wh ...

  8. UUID使用

    import java.util.UUID; public static String getUUID() { UUID uuid =UUID.randomUUID(); String str = u ...

  9. 思科CISCO 交换机命名规则

      思科交换机的命名规则要比路由的命名规则复杂, 看下这些:WS-C2960-24TC-L .WS-C2950G-24-EI-DC .WS-C2960-24TT-L .WS-C3750G-24TS-E ...

  10. vue 重要的东西