[思维] Jzoj P6277 矩阵游戏
题解
- 我们发现对于每一行的操作之后相邻两列的和之间的公差是相等的,并且后一列的和比前一列的和大
- 因此对于行的操作我们可以维护前两列,作出公差,之后再得出每一列的和,再乘上每一列的系数即可
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define ll long long 5 using namespace std; 6 const ll N=1e6+10,mo=1e9+7; 7 char s[5]; 8 ll n,m,k,cnt,ans,r,sum[N],a[N],b[N]; 9 struct node { ll x,y; }p[N]; 10 int main() 11 { 12 freopen("game.in","r",stdin),freopen("game.out","w",stdout),scanf("%lld%lld%lld",&n,&m,&k); for (ll i=1;i<=n;i++) a[i]=((i-1)*m+1)%mo,b[i]=1; 13 for (ll i=1,x,y;i<=k;i++) 14 { 15 scanf("%s%lld%lld",s,&x,&y); 16 if (s[0]=='S') { p[++cnt]=(node){x,y}; continue; } 17 a[x]=a[x]*y%mo,b[x]=b[x]*y%mo; 18 } 19 for (ll i=1;i<=n;i++) sum[1]=(sum[1]+a[i])%mo,r=(r+b[i])%mo; 20 for (ll i=2;i<=m;i++) sum[i]=(sum[i-1]+r)%mo; 21 for (ll i=1;i<=cnt;i++) sum[p[i].x]=(sum[p[i].x]*p[i].y)%mo; 22 for (ll i=1;i<=m;i++) (ans+=sum[i])%=mo; 23 printf("%lld",ans); 24 }