10.07T1 找结论
1.矩阵游戏
(game.pas/c/cpp)
【问题描述】
LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵。第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+1,(N-1)*M+2…N*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(1 ≤ X ≤ N)行变为原来的Y(0 ≤ Y ≤10
9
)倍.
S X Y,表示将矩阵的第X(1 ≤ X ≤ M)列变为原来的Y(0 ≤ Y ≤10
9
)倍.
【输出】
输出一行一个整数,表示最终矩阵内所有元素的和对10
9
+7取模的结果。
【输入输出样例】
样例1 |
样例2 |
||
game.in |
game.out |
game.in |
game.out |
|
94 |
2 4 4 S 2 0 S 2 3 R 1 5 S 1 3 |
80 |
样例一的解释:操作结束之后矩阵会变成这样:
1 |
2 |
3 |
4 |
0 |
0 |
0 |
0 |
18 |
20 |
22 |
24 |
【数据范围】
40%的数据满足:1≤N,M≤1000;
80%的数据满足:1≤N,M≤1000000,1 ≤ K ≤1000;
100%的数据满足:1≤N,M≤1000000,1 ≤ K ≤100000。
这题我竟然爆零了>_<
考虑分开行列来看我们先操作列的操作,我们可以计算出行行之间的新delta
然后每次加上新的delta乘上行的系数就是答案了(我tm竟然画出来了都没有看出来)
这种题实际上没有多难,看你能不能乱搞出什么结论,或者直接自己造几组数据(一般样例都比较坑)来发现规律,分开考虑啊!!!!
做的题目太少了
code:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const long long mod=1e9+7; 5 long long hang[1000005],lie[1000005]; 6 int main(){ 7 freopen("game.in","r",stdin); 8 freopen("game.out","w",stdout); 9 long long m,n,k; 10 cin>>n>>m>>k; 11 for(long long i=1;i<=n;i++)hang[i]=1; 12 for(long long i=1;i<=m;i++)lie[i]=1; 13 while(k--){ 14 char t; 15 cin>>t; 16 if(t=='R'){ 17 long long x,y; 18 cin>>x>>y; 19 hang[x]*=y; 20 hang[x]%=mod; 21 } 22 else{ 23 long long x,y; 24 cin>>x>>y; 25 lie[x]*=y; 26 lie[x]%=mod; 27 } 28 } 29 long long cnt=0,delta=0; 30 long long ans=0; 31 for(long long i=1;i<=m;i++){ 32 cnt=(cnt+1ll*i*lie[i]%mod)%mod; 33 delta+=1ll*m*lie[i]; 34 delta%=mod; 35 } 36 for(long long i=1;i<=n;i++){ 37 ans+=(1ll*cnt*hang[i])%mod; 38 ans%=mod; 39 cnt+=delta; 40 cnt%=mod; 41 } 42 cout<<ans; 43 return 0; 44 }
over