矩阵游戏
考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分
题解
算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值
算第一列我们只需要让当前点*行增倍的数量就行了
for(ll i=1;i<=n;i++){ nowlie=(nowlie+elephant(i,1)*hang[i])%mod; sum=(sum+hang[i]); }
算其他列
nowlie=(nowlie+sum)%mod;
可能这一列会加倍只需乘上就行了
ans=(ans+nowlie*lie[i])%mod;
思路简单代码好打,然而考试我还是打炸了
代码
#include<bits/stdc++.h> using namespace std; #define ll long long #define A 1010101 const ll mod=1e9+7; ll n,m,nowlie=0,sum=0,ans=0,k; ll lie[A],hang[A]; char c[5]; ll elephant(ll i,ll j){ return ((i-1)*m%mod+j)%mod; } int main(){ scanf("%lld%lld%lld",&n,&m,&k); for(ll i=1;i<=1000000;i++){ hang[i]=1; lie[i]=1; } for(ll i=1,a,x;i<=k;i++){ scanf("%s",c+1); scanf("%lld%lld",&a,&x); if(c[1]=='S'){ lie[a]=lie[a]*x%mod; } if(c[1]=='R'){ hang[a]=hang[a]*x%mod; } } for(ll i=1;i<=n;i++){ nowlie=(nowlie+elephant(i,1)*hang[i])%mod; sum=(sum+hang[i]); } for(ll i=1;i<=m;i++){ ans=(ans+nowlie*lie[i])%mod; nowlie=(nowlie+sum)%mod; } cout<<ans<<endl; }