题目描述

tabris实在是太菜了,没打败恶龙,在绿岛也只捡到一块生铁回去了,为了不在继续拉低acimo星球的平均水平逃离地球,来到了Sabi星球.

在这里tabris发现了一种神奇的生物,这种生物不需要与外界交流,种群间不同个体能互相维持生命存在及提供生长所需的能量.

每个种群有N个不同个体,围成一个圈,每隔一个单位时间都会生长.

在一个单位时间里,每个个体会向两边辐射能量,辐射范围与强度均为K,随着距离的增加辐射强度会减小,距离每增加1辐射强度减小1 ,在这单位时间通过辐射接受的能量会保留,最开始的能量会消耗掉。

对于两个个体a、b,其中a对b的辐射会使b增加【辐射强度×a最开始的能量值】.

总体的改变可以表示成
 
 

注:[∗] * 为真时为1 *为假时为0

现在tabris想知道经过M单位时间后,每个个体的能量值是多少.

输入描述:

输入一个T,表示测试数据的组数
每个测试数据第一行包含三个正整数N,M,K.
接下来一行包含N个正整数a[i];

T∈[1,200]
N∈[1,200]
K∈[1,⌊n/2⌋]
M∈[1,1018]
a[i]∈[1,106]

输出描述:

对每组测试样例输出经过M单位时候后每个个体的能量,为了方便起见对1e9+7取模.
示例1

输入

1
5 1 3
1 1 1 1 1

输出

6 6 6 6 6

题解

矩阵快速幂。

观察给的公式和数据范围就可以知道可以用矩阵快速幂来搞,但是矩阵乘法复杂度为$O(n^3)$,又要乘上个$logM$,还有$200$组数据,复杂度炸了。

通过观察可以发现,这个矩阵是个循环矩阵,第二列和第一列是有关系的,也就是说只要计算第一列即可,因此矩阵乘法的复杂度降低到了$O(n^2)$。

总体复杂度是$O(T*n^2*logM)$。

#include <bits/stdc++.h>
using namespace std; const long long mod = 1e9 + 7;
const int maxn = 200 + 5;
int T;
int n, k;
long long M;
long long x[maxn];
long long ans[maxn]; struct Matrix {
int r, c;
long long a[maxn][maxn];
Matrix(int R, int C) {
r = R;
c = C;
for(int i = 0; i < r; i ++) {
for(int j = 0; j < c; j ++) {
a[i][j] = 0;
}
}
}
}; Matrix mul(const Matrix &a, const Matrix &b) {
Matrix res(0, 0);
res.r = a.r;
res.c = b.c;
memset(res.a, 0, sizeof res.a);
for(int i = 0; i < res.r; i ++) {
for(int j = 0; j < 1; j ++) {
for(int k = 0; k < a.c; k ++) {
long long sum = a.a[i][k] * b.a[k][j] % mod;
res.a[i][j] = (res.a[i][j] + sum) % mod;
}
}
}
for(int j = 1; j < res.c; j ++) {
for(int i = 1; i < res.r; i ++) {
res.a[i][j] = res.a[i - 1][j - 1];
}
res.a[0][j] = res.a[res.r - 1][j - 1];
}
return res;
} void init() {
Matrix A(n, n), B(n, n); for(int j = 0; j < n; j ++) {
for(int i = 0; i < n; i ++) {
if(i == j) continue;
int dis = min(abs(i - j), n - abs(i - j));
if(dis >= k) continue;
A.a[i][j] = k - dis;
}
} for(int i = 0; i < n; i ++) {
B.a[i][i] = 1;
} while(M) {
if(M & 1) B = mul(B, A);
M = M / 2;
A = mul(A, A);
}
/*
for(int j = 0; j < n; j ++) {
for(int i = 0; i < n; i ++) {
printf("%3lld ", B.a[i][j]);
}
printf("\n");
}
*/
for(int j = 0; j < n; j ++) {
for(int i = 0; i < n; i ++) {
long long sum = x[i] * B.a[i][j] % mod;
ans[j] = (ans[j] + sum) % mod;
}
}
} int main() {
scanf("%d", &T);
while(T --){
scanf("%d%lld%d", &n, &M, &k);
for(int i = 0; i < n; i ++) {
scanf("%lld", &x[i]);
ans[i] = 0;
}
init();
for(int i = 0; i < n; i ++) {
printf("%lld", ans[i]);
if(i < n - 1) printf(" ");
else printf("\n");
}
}
return 0;
}

  

哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字的更多相关文章

  1. 哈尔滨理工大学第七届程序设计竞赛初赛(BFS多队列顺序)

    哈尔滨理工大学第七届程序设计竞赛初赛https://www.nowcoder.com/acm/contest/28#question D题wa了半天....(真真正正的半天) 其实D题本来就是一个简单 ...

  2. 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)I - B-旅行

    题目描述 小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城. ...

  3. 哈尔滨理工大学第七届程序设计竞赛(G.Great Atm)

    Description An old story said the evil dragon wasn't evil at all, only bewitched, and now that the r ...

  4. 北京师范大学第十六届程序设计竞赛决赛-重现赛-B题

    一.题目链接 https://www.nowcoder.com/acm/contest/117/B 二.题意 给定一组序列$a_1,a_2,\cdots,a_n$,表示初始序列$b_1,b_2,\cd ...

  5. 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛

    链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  6. 陕西师范大学第七届程序设计竞赛网络同步赛 I 排队排队排队【数组任一位可以移动到队头,最少移动几次增序/数组指针操作】

    链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...

  7. 长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone

    链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Qu ...

  8. 哈尔滨理工大学第六届程序设计团队 H-Permutation

    /* 数学是硬伤......推了半小时推出来一个错误的公式 */ #include <iostream> #include <stdio.h> #include <alg ...

  9. 哈尔滨理工大学第六届程序设计团队 E-Mod

    /* 成功水过,哈哈哈,可能数据水吧 */ #include <stdio.h> #include <algorithm> #include <string.h> ...

随机推荐

  1. 隐藏超出父元素的子元素的部分:overflow

    overflow : 针对超出父级的内容如何显示 值: visible 默认值,超出的内容会显示出来 auto 如果内容超出了父级,那就出现滚动条.如果内容没有超出,就没有滚动条 hidden 超出的 ...

  2. Tensorboard教程:显示计算图中节点信息

    Tensorboard显示计算图节点信息 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1 ...

  3. HDU 4496 并查集 逆向思维

    给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...

  4. 2017ACM暑期多校联合训练 - Team 6 1001 HDU 6096 String (字符串处理 字典树)

    题目链接 Problem Description Bob has a dictionary with N words in it. Now there is a list of words in wh ...

  5. 2017ACM暑期多校联合训练 - Team 1 1006 HDU 6038 Function (排列组合)

    题目链接 Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m ...

  6. Spring Data JPA笔记

    1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...

  7. nth-child,nth-last-child,only-child,nth-of-type,nth-last-of-type,only-of-type,first-of-type,last-of-type,first-child,last-child伪类区别和用法

    我将这坨伪类分成三组,第一组:nth-child,nth-last-child,only-child第二组:nth-of-type,nth-last-of-type,第三组:first-of-tpye ...

  8. Mac nginx 配置

    nginx 安装: 在苹果系统下如果要安装nginx,首先要安装brew.安装brew可以查看网站:https://brew.sh: 一条命令即可搞定:/usr/bin/ruby -e "$ ...

  9. Linux kernel学习-内存管理

    转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://z ...

  10. linux的curl用法【转】

    每分钟访问云签到任务执行页面.顺便记录了下curl的用法.以下内容摘自阮一峰博客. 一.查看网页源码 直接在curl命令后加上网址,就可以看到网页源码.我们以网址www.sina.com为例(选择该网 ...