Hướng dẫn giải của Sự kiện kì lạ

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Tác giả: bachminhkhang

Subtask ~1~

Đặt mod = 1000000007.

  • Với truy vấn thứ ~i~, ta khởi tạo ~ans = A_{i}~ và duyệt từ ~2 \to N_{i}~ : ~ans = (ans + B_{i}) \% mod~.
  • Độ phức tạp: ~O(Q \times N)~.
  • Code tham khảo:
void solve()
{
    for(int i = 1; i <= q; ++i)
    {
        ll res = a[i] % mod;
        for(int j = 2; i <= n[i]; ++j) res = (res + b[i]) % mod;
        cout << res << ' ';
    }
}

Subtask ~2~

  • Ta có thể nhận thấy bài toán chính là tìm số hạng thứ ~N~ của cấp số cộng.
  • Áp dụng công thức cấp số cộng : ~ans = (A_{i} + (N_{i} - 1) \times B_{i}) \% mod~.
  • Độ phức tạp: ~O(Q)~.

Lưu ý: Ta có một số phép khai triển đối với toán tử % để tránh tràn số

  • ~(a + b) \% mod = [(a \% mod) + (b \% mod)] \% mod~.
  • ~(a \times b) \% mod = [(a \% mod) \times (b \% mod)] \% mod~.
  • Code tham khảo:

#include<bits/stdc++.h>
#define reu(i,a,b) for(int i=a,_b=b;i<=_b;++i)
#define red(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
#define mp make_pair
#define ll long long
#define ii pair<int,int>
#define fi first
#define se second
#define iii pair<int,pair<int,int> >
#define sz(x) int(x.size())
using namespace std;

const int N = 1e6 + 7;
const ll mod = 1e9 + 7;

long long a[N], b[N], n[N], q;

void input()
{
    cin >> q;
    reu(i, 1, q) cin >> n[i];
    reu(i, 1, q) cin >> a[i];
    reu(i, 1, q) cin >> b[i];
}

void solve()
{
    reu(i, 1, q)
    {
        ll res = (a[i] % mod + ((n[i] - 1) % mod) * (b[i] % mod)) % mod;
        cout << res;
        if(i < q) cout << ' ';
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    input();
    solve();
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.