哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字
题目描述
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
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 - 没有名字的更多相关文章
- 哈尔滨理工大学第七届程序设计竞赛初赛(BFS多队列顺序)
哈尔滨理工大学第七届程序设计竞赛初赛https://www.nowcoder.com/acm/contest/28#question D题wa了半天....(真真正正的半天) 其实D题本来就是一个简单 ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)I - B-旅行
题目描述 小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城. ...
- 哈尔滨理工大学第七届程序设计竞赛(G.Great Atm)
Description An old story said the evil dragon wasn't evil at all, only bewitched, and now that the r ...
- 北京师范大学第十六届程序设计竞赛决赛-重现赛-B题
一.题目链接 https://www.nowcoder.com/acm/contest/117/B 二.题意 给定一组序列$a_1,a_2,\cdots,a_n$,表示初始序列$b_1,b_2,\cd ...
- 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛
链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- 陕西师范大学第七届程序设计竞赛网络同步赛 I 排队排队排队【数组任一位可以移动到队头,最少移动几次增序/数组指针操作】
链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone
链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Qu ...
- 哈尔滨理工大学第六届程序设计团队 H-Permutation
/* 数学是硬伤......推了半小时推出来一个错误的公式 */ #include <iostream> #include <stdio.h> #include <alg ...
- 哈尔滨理工大学第六届程序设计团队 E-Mod
/* 成功水过,哈哈哈,可能数据水吧 */ #include <stdio.h> #include <algorithm> #include <string.h> ...
随机推荐
- cc1: warnings being treated as errors解决办法
安装GDB时出现cc1: warnings being treated as errors Edit the Makefile and delete this line:WERROR_CFLAGS = ...
- MyBatis操作oracle的一些问题加载
mybatis在更新数据或者插入数据为空的时候必须指定jdbcType类型 1:传入的参数是对象类型 User user =new User(); INSERT INTO t_user ( id, u ...
- SQL Server 2008过期导致MSSQLSERVER服务无法启动现象
SQL Server 2008过期导致MSSQLSERVER服务无法启动现象:安装的是SQL Server 2008评估版,180天的试用期后,MSSQLSERVER服务就无法启动,手动启动就报告17 ...
- 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D
http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...
- Nodejs文件监控chokidar
最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...
- [csp-201709-3]JSON查询-编译原理
声明:这个代码几乎完全就是照抄hyh学长的!!! 有什么问题我会删掉这篇的emm 当初面试的时候我的方向就是编译原理...然后学长发了个1400+的代码实现一个简化的c编译器...没看懂qaq 感觉很 ...
- 【CodeForces】679 B. Bear and Tower of Cubes
[题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...
- (值类型引用类型)和null的关系
1.null null表示变量没有指向任何对象. 2.值类型 包括 bool.结构体.枚举.int.double.float等等 .在.NET中值类型都继承自ValueType. 3. 引 ...
- 127.0.0.1、localhost、0.0.0.0的区别
在开发web应用的测试环境中,如果希望同一个局域网的同事通过内网IP访问自己的应用,则需要把web服务监听的ip地址改为0.0.0.0.为什么用127.0.0.1不行,而用0.0.0.0就可以呢? f ...
- 深入理解Spring系列之一:开篇
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483810&idx=1&sn=a2df14fdb63 ...