题解 | #再编号#

再编号

https://ac.nowcoder.com/acm/problem/17375

考察知识点:前缀和

定义 sum(a)=i=1naisum(a)=\sum\limits_{i=1}^{n} a_i,考虑计算 sum(a)sum(a')

sum(a)=i=1nai=i=1n(sum(a)ai)=i=1nsum(a)i=1nai=(n1)sum(a)sum(a') = \sum\limits_{i=1}^{n} a'_i = \sum\limits_{i=1}^{n} (sum(a)-a_i) = \sum\limits_{i=1}^{n} sum(a) - \sum\limits_{i=1}^{n} a_i = (n-1)sum(a)

定义 at(x)a_t(x) 表示经过 tt 次再编号后第 xx 个人的编号,sumt{sum}_t 表示 tt 次再编号的编号和。

t>0t > 0 时,有:

at(x)=sumt1at1(x)a_t(x) = {sum}_{t-1}-a_{t-1}(x)

由此递推公式可得 at(x)a_t(x) 的通项:

at(x)=i=0t1(1)isumt1i+(1)ta0(x)a_t(x) = \sum\limits_{i=0}^{t-1} (-1)^i {sum}_{t-1-i} + (-1)^t a_0(x)

因为 sumt=(n1)sumt1{sum}_t=(n-1){sum}_{t-1},所以 i=0t1(1)isumt1i\sum\limits_{i=0}^{t-1} (-1)^i {sum}_{t-1-i} 事实上是一个等比数列,且有如下关系:

i=0t1(1)isumt1i=sumt1i=0t2(1)isumt2i\sum\limits_{i=0}^{t-1} (-1)^i {sum}_{t-1-i} = {sum}_{t-1} - \sum\limits_{i=0}^{t-2} (-1)^i {sum}_{t-2-i}

使用前缀和预处理 sumi{sum}_ii=0t1(1)isumt1i\sum\limits_{i=0}^{t-1} (-1)^i {sum}_{t-1-i},即为程序中的 s[i]p[i]

然后根据 t 的奇偶性,计算出 at(x)a_t(x) 的值即可。

时间复杂度O(n+m)O(n+m)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

#define MOD 1000000007
#define N 100005

void solve()
{
    int n, m;
    cin >> n >> m;
    ll a[N], s[N] = {0}, p[N] = {0};
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        s[0] = (s[0] + a[i]) % MOD;
    }
    for (int i = 1; i <= 100000; i++)
    {
        s[i] = ((n - 1) * s[i - 1] % MOD) % MOD;
        p[i] = (s[i - 1] - p[i - 1] + MOD) % MOD;
    }
    while (m--)
    {
        int x, t;
        cin >> x >> t;
        if (t == 0)
            cout << a[x] << endl;
        else if (t % 2)
            cout << (p[t] - a[x] + MOD) % MOD << endl;
        else
            cout << (p[t] + a[x]) % MOD << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}
全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务