题目描述

$LZK$发明一个矩阵游戏,大家一起来玩玩吧,有一个$N$行$M$列的矩阵。第一行的数字是$1,2,...,M$,第二行的数字是$M+1,M+2,...,2\times M$,以此类推,第$N$行的数字是$(N-1)\times M+1,(N-1)\times M+2,...,N\times M$。
例如$N=3,M=4$的矩阵是这样的:
1    2    3    4
5    6    7    8
9    10    11    12
对于身为智慧之神的$LZK$来说,这个矩阵过于无趣。于是他决定改造这个矩阵,改造会进行$K$次,每次改造会将矩阵的某一行或某一列乘上一个数字,你的任务是计算最终这个矩阵内所有数字的和,输出答案对${10}^9+7$取模。


输入格式

第一行包含三个正整$N$、$M$、$K$,表示矩阵的大小与改造次数。接下来的行,每行会是如下两种形式之一:
$R\ X\ Y$,表示将矩阵的第$X$行变为原来的$Y$倍。
$S\ X\ Y$,表示将矩阵的第$X$列变为原来的$Y$倍。


输出格式

输出一行一个整数,表示最终矩阵内所有元素的和对${10}^9+7$取模的结果。


样例

样例输入1:

3 4 4
R 2 4
S 4 1
R 3 2
R 2 0

样例输出1:

94

样例输入2:

2 4 4
S 2 0
S 2 3
R 1 5
S 1 3

样例输出2:

80


数据范围与提示

$40\%$的数据满足:$1\leqslant N,M\leqslant 1,000$;
$80\%$的数据满足:$1\leqslant N,M\leqslant 1,000,000,1\leqslant K\leqslant 1,000$;
$100\%$的数据满足:$1\leqslant N,M\leqslant 1,000,000,1\leqslant K\leqslant 100,000$。


题解

$40\%$算法:

暴力求出每一个点的初始值,暴力更改,暴力统计答案。

时间复杂度:$\Theta(N\times K)$。

期望得分:$40$分。

$100\%$算法:

显然,我们如果$\Theta(N\times M)$求出每一个点的初始值是不能接受的,所以我们考虑用式子推出,点$(i,j)$的初始值就是$(i-1)\times M+j$。

考虑乘法交换律,先乘和后乘一样,所以我们可以预处理出来$\prod R$和$\prod S$,设其分别为$h[i]$和$l[i]$。

再来推式子,每一个点对答案的贡献就是:$((i-1)\times M+j)\times h[i]\times l[i]$。

把式子拆开:$(i-1)\times M\times h[i]\times l[i]+j\times h[i]\times l[i]$。

我们可以维护$sumh=\sum \limits_{i=1}^N h[i]$和$sum=\sum \limits_{i=1}^N (i-1)\times M\times h[i]$。

那么答案即为$\sum \limits_{i=1}^M (sum+i\times sumh)\times l[i]$。

具体实现看代码叭~

时间复杂度:$\Theta(N+M)$。

期望得分:$100$分。


代码时刻

$40\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
long long Map[5000][5000];
long long ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
Map[i][j]=++cnt;
while(k--)
{
char ch[5];
long long x,y;
scanf("%s%lld%lld",ch+1,&x,&y);
if(ch[1]=='R')
for(int i=1;i<=m;i++)
Map[x][i]=(Map[x][i]*y)%1000000007;
else
for(int i=1;i<=n;i++)
Map[i][x]=(Map[i][x]*y)%1000000007;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans=(ans+Map[i][j])%1000000007;
printf("%lld",ans);
return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int h[1000001],l[1000001];
int sum,sumh,ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=1000000;i++)
h[i]=l[i]=1;
while(k--)
{
char ch[3];
int x,y;
scanf("%s%d%d",ch+1,&x,&y);
if(ch[1]=='R')h[x]=1LL*h[x]*y%1000000007;
else l[x]=1LL*l[x]*y%1000000007;
}
for(int i=1;i<=n;i++)
{
sum=(sum+(1LL*(i-1)*m+1)%1000000007*h[i]%1000000007)%1000000007;
sumh=(sumh+h[i])%1000000007;
}
for(int i=1;i<=m;i++)
{
ans=(ans+1LL*sum*l[i]%1000000007)%1000000007;
sum=(sum+sumh)%1000000007;
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:矩阵游戏(数学)的更多相关文章

  1. [luogu1397 NOI2013] 矩阵游戏 (数学)

    传送门 Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行 ...

  2. [CSP-S模拟测试]:Silhouette(数学)

    题目描述 有一个$n\times n$的网格,在每个格子上堆叠了一些边长为$1$的立方体. 现在给出这个三维几何体的正视图和左视图,求有多少种与之符合的堆叠立方体的方案.两种方案被认为是不同的,当且仅 ...

  3. [CSP-S模拟测试]:不等式(数学)

    题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...

  4. [CSP-S模拟测试]:壕游戏(费用流)

    题目传送门(内部题18) 输入格式 第一行包括四个数$n,m,k,s$表示有$n$个剧情点,$m$个关卡,要玩$k$次游戏,$s$个完结点接下来一行包含$s$个数,代表$s$个完结点的编号.接下来$m ...

  5. [CSP-S模拟测试]:A(数学)

    题目传送门(内部题44) 输入格式 一行四个整数,分别表示$S,T,a,b$. 输出格式 输出最小步数,数据保证有解. 样例 样例输入: 10 28 4 2 样例输出: 数据范围与提示 样例解释: 先 ...

  6. [CSP-S模拟测试]:装饰(数学)

    题目传送门(内部题147) 输入格式 每个测试点第一行一个正整数$T$,表示该测试点内的数据组数. 接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示. 输出格式 对每组数据输出一行一个 ...

  7. [CSP-S模拟测试]:最大值(数学+线段树)

    题目背景 $Maxtir$最喜欢最大值. 题目传送门(内部题128) 输入格式 第$1$行输入四个正整数$n,m,q$. 第$2$至$n+1$行中,第$i+1$行输入魔法晶石$i$的三种属性$(x_i ...

  8. [CSP-S模拟测试]:城市游戏(图论+DP)

    题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...

  9. [CSP-S模拟测试]:求和(数学)

    题目传送门(内部题107) 输入格式 一行五个正整数$x_1,y_1,x_2,y_2,m$ 输出格式 输出一个整数,为所求的答案对$m$取模后的结果. 样例 样例输入: 2 1 5 3 10007 样 ...

随机推荐

  1. CentOS7使用集群同步脚本对配置文件同步分发

    1.介绍 使用集群同步脚本对配置文件同步分发 2.操作 1)在/root目录下创建bin目录,并在bin目录下创建文件xsync,文件内容如下: [root@hadoop101 ~]$ mkdir b ...

  2. C#打印条码BarTender SDK打印之路和离开之路(web平凡之路)(转)

    C#打印条码BarTender SDK打印之路和离开之路(web平凡之路) 从来没想过自己会写一篇博客,鉴于这次从未知的探索到一个个难点的攻破再到顺利打印,很想记录这些点滴,让后人少走弯路. 下面走进 ...

  3. 环境变量和Path环境变量

    环境变量 百度百科下的定义 一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等. 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所 ...

  4. 最小生成树: HDU1233还是畅通工程

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. css是干什么的

    css这些长篇累牍的参数,其实就是这些所谓的css编程者每天要干的事情了,他们把这些参数熟记于心,就像c++程序员,把这些函数库熟记于心一样,都是编程. css定制了每一个单独的组件,这些组件要么是相 ...

  6. /cat/cpuinfo信息查看

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat /proc/cpuinfo| g ...

  7. react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置

    现状:目前从商品详情页返回到商品列表页,还需要再去请求服务数据,还需要用户再去等待获取数据的过程,这样用户体验非常不好, 遇到的问题: 1:如何将数据缓存, 2:如何获取和保存列表滑动的高度, 3:判 ...

  8. Vue之路由跳转 传参 aixos 和cookie

    一.路由跳转 1.1 项目的初始化 vue create m-proj   >>>创建vue项目 精简vue项目的 views 视图   About(基本是删除的) Home.(可以 ...

  9. wpf textbox ctrl+enter事件

    <TextBox x:Name="xcontent" Text="sfasdf" Grid.Row="0" AcceptsReturn ...

  10. 解密Qt安装目录的结构

    http://c.biancheng.net/view/3866.html 了解 Qt 安装目录的结构虽然不是编程必须的,但是它能练就我们的内功,让我们对 Qt 的编程环境了如指掌.Windows 和 ...