数字游戏(number)
数字游戏(number)
题目大意
不高兴找到了一个N行M列的矩阵。矩阵的第一行数字为 ,第二行数字为 ,第 行数字为 。
例如,对于 :
1 2 3 4
5 6 7 8
9 10 11 12
当然这样的矩阵是无趣的,所有他选择了其中一行或一列,将其乘以非负数,会进行 次。最后他想知道矩阵中所有值的总和。
数据范围:
对于 的数据,。
对于 的数据,。
解题思路
注意:由于本蒟蒻的习惯,可能会对大家造成影响。
这是求和。
这是循环。
一开始可以想到对于所有操作,暴力修改一遍,时间复杂度为 ,可拿 。(艹,为什么模拟赛时没打暴力?我是sb吗???
继续思考,显然可以将所有的操作全部合起来,搞一个离线算法。
即记 为第 行要乘上的非负数, 为第 列要乘上的非负数。
由于我们不能同时修改行和列,所以先选个修改列,再修改行吧。
此时可以发现,对于原矩阵 ,,所以在原矩阵中,第 行比第 行多 ,因此可以将第一行当做基准,依次求得第二行,第三行....第 行。
1 2 3 4
1+m 2+m 3+m 4+m
1+2m 2+2m 3+2m 4+2m
发现规律后,就可以开始修改列了,此时又可以发现,对于修改完列后的矩阵 , 比 多 ,第 行比第 行多 。
显然对于修改列后的矩阵 ,每一行的相差数也是不变的。
例如将第 列乘上 :
1 4 3 4
5 12 7 8
9 20 11 12
此时 数组为
1 2 1 1
则 。
先计算修改完列后的矩阵 第 行的和为 ( 为原矩阵 第 行的数)。
由上可得,修改完列后的矩阵 第 行的和为 。
则答案矩阵 第 行的和就为修改完列后的矩阵 第 行的和乘上 ,即为
此时已经可以求得修改完列后的矩阵 每一行的和了,乘上 再累加就结束了。
然后,就没有然后了。
AC CODE
#include<bits/stdc++.h>
#define int long long
const int mod = 1e9 + 7;
using namespace std;
int n, m, k;
int a, b, ans;
int lie[1000005], hang[1000005];
signed main()
{
scanf("%lld%lld%lld", &n, &m, &k);
for(int i = 1; i <= m; ++i) lie[i] = 1;
for(int i = 1; i <= n; ++i) hang[i] = 1;
for(int i = 1; i <= k; ++i)
{
char c[5];
int a, b;
scanf("%s", c);
scanf("%lld%lld", &a, &b);
if(c[0] == 'R') hang[a] = hang[a] * b % mod;
else lie[a] = lie[a] * b % mod;
}
for(int i = 1; i <= m; ++i)
{
a = (a + lie[i] * m % mod) % mod;
// a += lie[i] * m;
// 修改完列的矩阵 b 每一行的相差数。
b = (b + lie[i] * i % mod) % mod;
// b += lie[i] * i;
// 求修改完列的矩阵 b 的第一行的和。
}
for(int i = 1; i <= n; ++i)
{
ans = (ans + (b + a * (i - 1) % mod) * hang[i] % mod) % mod;
// ans += b + a * (i - 1) * hang[i];
// 求答案,这不用说了吧。
}
printf("%lld", ans % mod);
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122152
分类:
个人记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话