哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)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> ...
随机推荐
- [DeeplearningAI笔记]序列模型2.6Word2Vec/Skip-grams/hierarchical softmax classifier 分级softmax 分类器
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 Word2Vec Word2Vec相对于原先介绍的词嵌入的方法来说更加的简单快速. Mikolov T, Chen ...
- OpenCV---像素运算
像素运算 分为算术运算和逻辑运算 算术运算: 加减乘除 调节亮度 调整对比度 逻辑运算: 与或非 遮罩层控制 一:算术运算 import cv2 as cv import numpy as np de ...
- 最常用的8款 PHP 调试工具,你用过吗?
Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 Web 开发者和设计者 ...
- 通过删除hbase表中的region来达到删除表中数据
公司最近在搞一个hbase删除数据,由于在建表的时候是通过region来对每日的数据进行存储的,所以要求在删除的时候直接通过删除region的来删除数据(最好的方案是只删除region中的数据,不把r ...
- 树形DP初探•总结
这几天,我自学了基础的树形DP,在此给大家分享一下我的心得. 首先,树形DP这种题主要就是解决有明确分层次且无环的树上动态规划的题.这种题型一般(注意只是基础.普通的情况下)用深度优先搜索来解决实 ...
- 4-Python数据类型之元组-字符串
目录 1 元组概念 1.1 元祖的特点 1.2 元组的定义 1.3 元组的访问 1.4 元组的查询 2 命名元组 3 字符串 3.1 字符串的基本操作 3.1.1 字符串的访问 3.1.2 字符串的拼 ...
- python批量替换文件名
替换关键字 #-*-coding:utf-8-*- import os import re filepath = u'E:\\CMMI4\\07_测试文档' files = os.walk(filep ...
- 码源中国.gitignore忽略文件配置
码源中国.gitignore忽略文件配置 ## Ignore Visual Studio temporary files, build results, and ## files generated ...
- 144.Binary Tree Preorder Traversal---二叉树先序、中序非递归遍历
题目链接 题目大意:返回二叉树的先序遍历list.中序见94,后序见145. 法一:普通递归遍历,只是这里多了一个list数组,所以分成了两个函数.代码如下(耗时1ms): public List&l ...
- Machine Learning系列--EM算法理解与推导
EM算法,全称Expectation Maximization Algorithm,译作最大期望化算法或期望最大算法,是机器学习十大算法之一,吴军博士在<数学之美>书中称其为“上帝视角”算 ...