【Leetcode】P5530 奇妙序列

Leetcode P5530 奇妙序列

请你实现三个 API append,addAll 和 multAll 来实现奇妙序列。

请实现 Fancy 类 :

  • Fancy() 初始化一个空序列对象。
  • void append(val) 将整数 val 添加在序列末尾。
  • void addAll(inc) 将所有序列中的现有数值都增加 inc 。
  • void multAll(m) 将序列中的所有现有数值都乘以整数 m 。
  • int getIndex(idx) 得到下标为 idx 处的数值(下标从 0 开始),并将结果对 109 + 7 取余。如果下标大于等于序列的长度,请返回 -1 。

示例 :

输入:
["Fancy", "append", "addAll", "append", "multAll", "getIndex", "addAll", "append", "multAll", "getIndex", "getIndex", "getIndex"]
[[], [2], [3], [7], [2], [0], [3], [10], [2], [0], [1], [2]]
输出:
[null, null, null, null, null, 10, null, null, null, 26, 34, 20]

解释:
Fancy fancy = new Fancy();
fancy.append(2);   // 奇妙序列:[2]
fancy.addAll(3);   // 奇妙序列:[2+3] -> [5]
fancy.append(7);   // 奇妙序列:[5, 7]
fancy.multAll(2);  // 奇妙序列:[5*2, 7*2] -> [10, 14]
fancy.getIndex(0); // 返回 10
fancy.addAll(3);   // 奇妙序列:[10+3, 14+3] -> [13, 17]
fancy.append(10);  // 奇妙序列:[13, 17, 10]
fancy.multAll(2);  // 奇妙序列:[13*2, 17*2, 10*2] -> [26, 34, 20]
fancy.getIndex(0); // 返回 26
fancy.getIndex(1); // 返回 34
fancy.getIndex(2); // 返回 20

提示:

  • 1 <= val, inc, m <= 100
  • 0 <= idx <= 10^5
  • 总共最多会有 10^5 次对 append,addAll,multAll 和 getIndex 的调用。

双周赛最后一题。起先感觉特别像树状数组,线段树之类的,但这一块内容已经不太记得了,最后剩的时间也不多,也没想出来。看大佬们是用的逆元的思想,以前还没见到过,长见识了。

//
//  main.cpp
//  之前没遇到过的题,周赛没做出来
//  假设当前插入一个数,之前的乘和加的作用等价于 * mul + add
//  那么可以放入该数对应操作的逆元,也就是( - add) / mul
//  最后用总的 * mul + add,就能得到之后的操作加在这个数上得到的结果。很巧妙
//  其中/mul用费马小定理等价于* mul的p-2次方,写个快速幂
//  Copyright © 2020 ji luyang. All rights reserved.
//

class Fancy {
public:
    long mul, add;
    int mod = 1e9 + 7;
    vector<int> v;
    long qpow(long x, long y) {
        long res = 1, now = x;
        while(y) {
            if(y & 1) res = (res * now) % mod;
            now = (now * now) % mod;
            y >>= 1;
        }
        return res % mod;
    }
    Fancy() {
        mul = 1;
        add = 0;
    }
    
    void append(int val) {
        val = ((val - add) % mod + mod) % mod;
        val =(int)((val * qpow(mul, mod - 2)) % mod);
        v.push_back(val);
    }
    
    void addAll(int inc) {
        add += inc;
    }
    
    void multAll(int m) {
        mul = (mul * m) % mod;
        add = (add * m) % mod;
    }
    
    int getIndex(int idx) {
        if(idx >= v.size()) return -1;
        int val = v[idx];
        val = (val * mul) % mod;
        val = (val + add) % mod;
        return val;
    }
};

/**
 * Your Fancy object will be instantiated and called as such:
 * Fancy* obj = new Fancy();
 * obj->append(val);
 * obj->addAll(inc);
 * obj->multAll(m);
 * int param_4 = obj->getIndex(idx);
 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值