zoukankan      html  css  js  c++  java
  • 九校联考-长沙市一中NOIP模拟Day1T1 矩阵游戏(game)

    问题描述

    LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵。第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2M,以此类推,第N行的数字是(N-1)M+1,(N-1)M+2…NM。
    例如,N=3,M=4的矩阵是这样的:
    1 2 3 4
    5 6 7 8
    9 10 11 12
    对于身为智慧之神的LZK来说,这个矩阵过于无趣.于是他决定改造这个矩阵,改造会进行K次,每次改造会将矩阵的某一行或某一列乘上一个数字,你的任务是计算最终这个矩阵内所有数字的和,输出答案对109+7取模。

    输入

    第一行包含三个正整数N、M、K,表示矩阵的大小与改造次数。接下来的行,每行会是如下两种形式之一:

    R X Y,表示将矩阵的第X(1 ≤ X ≤ N)行变为原来的Y(0 ≤ Y ≤109)倍.

    S X Y,表示将矩阵的第X(1 ≤ X ≤ M)列变为原来的Y(0 ≤ Y ≤109)倍.

    输出

    输出一行一个整数,表示最终矩阵内所有元素的和对109+7取模的结果。

    输入输出样例

    样例1

    3 4 4
    R 2 4
    S 4 1
    R 3 2
    R 2 0

    94

    样例2

    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。

    rol[n], lin[m]两个标记数组,记录每一行或是每一列要乘上多少。假设我们没有列的操作,那么一列看成一个数,整张图就是一个长度为m的等差数列,不想O(1)的话O(m)就能求出来。现在加上了列的操作。其实就是对于每一个数ai乘上了一个lzy_lin[i],只要按顺序算到ai,然后答案加上ai * lzy_lin[i]就行了…………听起来很暴力然而能过。。。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    using namespace std;
    typedef long long ll;
    typedef double db;
    const int INF = 0x3f3f3f3f;
    const ll mod = 1e9 + 7;
    const int maxn = 1e6 + 5;
    inline ll read()
    {
        ll ans = 0;
        char ch = getchar(), last = ' ';
        while(!isdigit(ch)) {last = ch; ch = getchar();}
        while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
        if(last == '-') ans = -ans;
        return ans;
    }
    inline void write(ll x)
    {
        if(x < 0) x = -x, putchar('-');
        if(x >= 10) write(x / 10);
        putchar(x % 10 + '0');
    }
    
    int n, m, q; 
    char c[5];
    ll lzy_rol[maxn], lzy_lin[maxn]; 
    ll s = 0, d = 0, sum = 0;
    
    ll getnum(int x, int i)
    {
        return ((ll)(i - 1) * m + x) % mod;
    }
    
    int main()
    {
        freopen("game.in", "r", stdin);
        freopen("game.out", "w", stdout);
        n = read(); m = read(); q = read();
        for(int i = 1; i < maxn; ++i) lzy_rol[i] = lzy_lin[i] = 1;
        for(int i = 1; i <= q; ++i)
        {
            scanf("%s", c); int x = read(); ll k = read();
            if(c[0] == 'R') lzy_rol[x] *= k, lzy_rol[x] %= mod;    
            else lzy_lin[x] *= k, lzy_lin[x] %= mod;
        }
        for(int i = 1; i <= n; ++i)
        {
            s += getnum(1, i) * lzy_rol[i]; s %= mod;
            d += lzy_rol[i]; d %= mod;
        }
        for(rg int i = 1; i <= m; ++i)        
        {
            sum += lzy_lin[i] * s; sum %= mod;
            s += d; s %= mod;
        }
        write(sum); enter;
        return 0;
    }
    
  • 相关阅读:
    一个机智的数组去重方法
    gets(),fgets()的作用机制探究
    性能优化之布局优化
    android 中theme和style的语法相关
    可以一直滚动的跑马灯
    ExpandableListView的OnitemLongclickListener事件
    关于 edittext 软键盘退出监听解决办法
    Android 开发之拦截EditText的输入内容,定制输入内容
    decimalFormat(小数格式)
    oracle常用
  • 原文地址:https://www.cnblogs.com/shulker/p/9662977.html
Copyright © 2011-2022 走看看