数字游戏(number)
数字游戏(number)
题目大意
不高兴找到了一个N行M列的矩阵。矩阵的第一行数字为 1,2,3,...,M1,2,3,...,M1,2,3,...,M,第二行数字为 M+1,M+2,...,2×MM+1,M+2,...,2 \times MM+1,M+2,...,2×M,第 NNN 行数字为 (N−1)×M+1,(N−1)×M+2,...,N×M(N-1)\times M+1,(N-1) \times M+2,...,N \times M(N−1)×M+1,(N−1)×M+2,...,N×M。
例如,对于 N=3,M=4N=3,M=4N=3,M=4 :
1 2 3 4
5 6 7 8
9 10 11 12
当然这样的矩阵是无趣的,所有他选择了其中一行或一列,将其乘以非负数,会进行 KKK 次。最后他想知道矩阵中所有值的总和。由于总和可能会很大,需要总和模109+7。\color{red}{由于总和可能会很大,需要总和模 \ 10^9+7。}由于总和可能会很大,需要总和模 109+7。
数据范围:
对于 50%50\%50% 的数据,1<=N,M<=10001<=N,M<=10001<=N,M<=1000。
对于 100%100\%100% 的数据,1<=N,M<=1000000,1<=K<=1000,0<=X,Y<=1091<=N,M<=1000000,1<=K<=1000,0<=X,Y<=10^91<=N,M<=1000000,1<=K<=1000,0<=X,Y<=109。
解题思路
注意:由于本蒟蒻的习惯,可能会对大家造成影响。
∑i=1n→\sum_{i=1}^{n} \to∑i=1n→ 这是求和。
∑i=1n→\sum\limits_{i=1}^{n} \toi=1∑n→ 这是循环。
一开始可以想到对于所有操作,暴力修改一遍,时间复杂度为 O(nk)O(nk)O(nk),可拿 50pts50pts50pts。(艹,为什么模拟赛时没打暴力?我是sb吗???
继续思考,显然可以将所有的操作全部合起来,搞一个离线算法。
即记 hangihang_ihangi 为第 iii 行要乘上的非负数,lieilie_iliei 为第 iii 列要乘上的非负数。
由于我们不能同时修改行和列,所以先选个修改列,再修改行吧。
此时可以发现,对于原矩阵 aaa,ai,j=ai−1,j+ma_{i,j} = a_{i-1,j} + mai,j=ai−1,j+m,所以在原矩阵中,第 iii 行比第 i−1i-1i−1 行多 m2m^2m2,因此可以将第一行当做基准,依次求得第二行,第三行…第 nnn 行。
1 2 3 4
1+m 2+m 3+m 4+m
1+2m 2+2m 3+2m 4+2m
发现规律后,就可以开始修改列了,此时又可以发现,对于修改完列后的矩阵 bbb,bi,jb_{i,j}bi,j 比 bi−1,jb_{i-1,j}bi−1,j 多 m×liejm\times lie_jm×liej,第 iii 行比第 i−1i-1i−1 行多 a=∑k=1mliek×ma=\sum_{k=1}^{m} lie_k \times ma=∑k=1mliek×m。
显然对于修改列后的矩阵 bbb,每一行的相差数也是不变的。
例如将第 222 列乘上 222:
1 4 3 4
5 12 7 8
9 20 11 12
此时 lielielie 数组为
1 2 1 1
则 bi,j=bi−1,j+m×liejb_{i,j} = b_{i-1,j}+m\times lie_jbi,j=bi−1,j+m×liej。
先计算修改完列后的矩阵 bbb 第 111 行的和为 b=∑k=1mliek×ib=\sum_{k=1}^{m} lie_k \times ib=∑k=1mliek×i( iii 为原矩阵 aaa 第 111 行的数)。
由上可得,修改完列后的矩阵 bbb 第 iii 行的和为 b+a×(i−1)b+a \times (i-1)b+a×(i−1)。
则答案矩阵 ccc 第 iii 行的和就为修改完列后的矩阵 bbb 第 iii 行的和乘上 hangihang_ihangi,即为 b+a×(i−1)×hangib+a \times (i-1) \times hang_ib+a×(i−1)×hangi
此时已经可以求得修改完列后的矩阵 bbb 每一行的和了,乘上 hangihang_ihangi 再累加就结束了。
然后,就没有然后了。
十年OI一场空,不开longlong见祖宗\color{red}{十年 \ OI \ 一场空,不开 \ long \ long \ 见祖宗}十年 OI 一场空,不开 long long 见祖宗
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;
}
数字游戏(number)相关推荐
- 【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记
文章目录 T1:数字游戏 题目 CODE T2:公交换乘 题目 CODE T3:纪念品 题目 题解 CODE T4:加工领奖 题目 题解 CODE 关于普及组的想法&游记 T1:数字游戏 题目 ...
- 数字游戏 (number)
一道十分毒瘤的模拟题.代码很短,推我花了二三十分钟. 数字游戏 传送门 - 数字游戏 Description 不高兴找到了一个 NNN 行 MMM 列的矩阵. 矩阵的第一行数字为 111 , 222 ...
- 2019年CSP-J2第一题:数字游戏(number)题解
题目来源 2019年CSP-J第二轮认证,第一题数字游戏. 题面链接:http://47.110.135.197/problem.php?id=5076. 题面 小 K 同学向小 P 同学发送了一个长 ...
- bzoj:1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶 ...
- python猜数字游戏简单-python猜数字游戏快速求解解决方案
python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...
- python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)&q ...
- python写一个游戏多少代码-Python项目实战之猜数字游戏(含实现代码)
猜数字游戏,旨在提高初学者对 Python 变量类型以及循环结构的使用. 此游戏的游戏规则如下:程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字.用户每猜测一次,由系统提示猜测结果 ...
- 洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game
洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game 题目描述 Bessie is playing a number game against Farmer John, ...
- python猜数游戏流程_Python 猜数字游戏
游戏内容:猜数字游戏 游戏过程描述 程序运行起来,随机在某个范围内选择一个整数. 提示用户输入数字,也就是猜程序随即选的那个数字. 程序将用户输入的数字与自己选定的对比,一样则用户完成游戏,否则继续猜 ...
- 《Python游戏编程快速上手》第三章-猜数字游戏
有段时间没有写博客了,最近在看<Python游戏编程快速上手>一书,计划自己用python写个小游戏玩玩.所以接下来我会把这本书中的所有游戏例子自己实现一遍,然后开始写一个自己的小游戏,话 ...
最新文章
- Git使用笔记(一)
- winform下载网页源码
- “export ‘default‘ (imported as ‘echarts‘) was not found in ‘echarts‘
- C语言小白适合入门的项目——扫雷
- Lync和Exchange 2013集成PART4:配置统一存档
- 【API进阶之路】高考要考口语?我用多模态评测API做了一场10w+刷屏活动
- AtomicReference 和 volatile 的区别
- poatman32位下载_Postman.dll下载|Postman.dll下载官方版【32位|64位】-太平洋下载中心...
- Alpha、Beta、RC、GA、RTM、OEM等版本的解释
- Python新手到熟练的百天之路
- 这四种加薪理由,肯定没戏!
- python遍历二维秋天_只要一杯秋天的奶茶,就能学会Python数值分析(1)
- 使用lombok时,get/set方法冒红问题
- Redis 如何实现库存扣减操作和防止被超卖?(荣耀典藏版)
- CSS3权威指南读书笔记
- 159.Vue实现个人博客(七)【Vue2.0-路由参数】 2019.03.15
- Three——二、加强对三维空间的认识
- 小米手机第一次使用SSR提示“创建一个XXX链接”,无法点击确定
- 【Java】进制转换
- B站兄弟连Linux视频笔记
热门文章
- 【ES6】Reflect 反射
- win10服务器怎么连接显示器不亮,Win10检测不到第二个显示器怎么解决?Win10外接显示器黑屏解决方法...
- 从0到1搭建大数据平台之开篇
- Linux平台基于v4l2开发免驱摄像头-输出为Opencv Mat
- 分数换算小数补0法_小学数学常用公式大全(单位换算表),替孩子收藏一份...
- 大事务的处理方式对比
- Kali 解决默认启动HDMI没有声音问题
- python学习:用两种思路计算质数与合数
- 高一计算机会考英语作文,高一考试英语作文常考题目及范文
- 运行JavaScript代码片段的19种工具