——九校聯考24OI__D1T1 c++
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次,每次改造會將矩陣的某一行或某一列乘上一個數字,你的任務是計算最終這個矩陣內全部數字的和,輸出答案對109+7取模。spa
第一行包含三個正整數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\))倍.code
輸出一行一個整數,表示最終矩陣內全部元素的和對\(10^9+7\)取模的結果。遊戲
input
3 4 4
R 2 4
S 4 1
R 3 2
R 2 0
output
94ci
input
2 4 4
S 2 0
S 2 3
R 1 5
S 1 3
output
80element
樣例一的解釋:操做結束以後矩陣會變成這樣:
1 2 3 4
0 0 0 0
18 20 22 24input
40%的數據知足:1≤N,M≤1000;
80%的數據知足:1≤N,M≤1000000,1 ≤ K ≤1000;
100%的數據知足:1≤N,M≤1000000,1 ≤ K ≤100000。數學
這道題看似是什麼數據結構,其實就是數學題。
每個行都是等差數列(列也是),求出每一行數字的和s[i]。每一次橫行的乘法操做就是重構一下通項公式,每一次縱列的乘法操做就是改變每個數列中的一項,至於每一行增長了多少,就用通項求那個數是多少,再求增長量,加到s[i]裏。
別忘了開longlong,取模,好多同窗都忘了這個。it
#include <bits/stdc++.h> using namespace std; int N,M,K; const int MOD = (1e9) + 7; int R[1000005]; int sumR; int C[1000005]; int S; int rez; int element(int i,int j){ return (1LL * (i - 1) * M + j) % MOD; } int main() { // freopen("game.in","r",stdin); // freopen("game.out","w",stdout); for(int i = 1;i <= 1000000;i++){ R[i] = C[i] = 1; } cin >> N >> M >> K; for(int i = 1;i <= K;i++){ char c; int x,y; cin >> c >> x >> y; if(c == 'R'){ R[x] = 1LL * R[x] * y % MOD; } else { C[x] = 1LL * C[x] * y % MOD; } } for(int i = 1;i <= N;i++){ S = (1LL * S + 1LL * element(i,1) * R[i]) % MOD; sumR += R[i]; if(sumR >= MOD){ sumR -= MOD; } } for(int i = 1;i <= M;i++){ rez = (1LL * rez + 1LL * S * C[i]) % MOD; if(rez >= MOD){ rez -= MOD; } S += sumR; if(S >= MOD){ S -= MOD; } } cout << rez<<endl; return 0; }