NOIP模拟测试13「矩阵游戏·跳房子·优美序列」

矩阵游戏

考试时思路一度和正解一样,考试到最后还是打了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;
}

猜你喜欢

转载自www.cnblogs.com/znsbc-13/p/11302998.html