Submission #4034146


Source Code Expand

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

#define MOD 1000000007ll
#define MAXN 200005
typedef long long ll;
typedef unsigned long long ull;
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))

ll read()
{
    char c = getchar();
    ll ret = 0;
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') ret = ret * 10 + c - '0', c = getchar();
    return ret;
}

int N;
ll blocklen, pn = 1, pk = 0, anst = 1, inv[MAXN], mul[MAXN], mulinv[MAXN], ans[MAXN], inv2 = (MOD + 1) >> 1; //pn, pk是莫队用的指针,anst是临时答案,mul是阶乘,mulinv是阶乘逆元,inv是逆元,ans存答案(因为离线存储打乱了顺序),inv2是2的逆元
struct query
{
    ll n, k, id, block;
} Q[MAXN];
bool cmp(query q1, query q2)
{
    if (q1.block != q2.block) return q1.block < q2.block;
    else return q1.k < q2.k;
}
ll ask(ll n, ll m)
{
    return ((mul[n] * mulinv[m]) % MOD * mulinv[n - m]) % MOD;
} 
void move(int t)
{
    switch(t)
    {
        case 1: anst = ((anst + ask(pn, pk + 1)) % MOD + MOD) % MOD, ++pk; break;
        case 2: anst = ((anst - ask(pn, pk)) % MOD + MOD) % MOD, --pk; break;
        case 3: anst = (((2 * anst) % MOD - ask(pn, pk)) % MOD + MOD) % MOD, ++pn; break;
        case 4: anst = ((inv2 * ((anst + ask(pn - 1, pk)) % MOD)) % MOD + MOD) % MOD, --pn; break;
    }
}

int main()
{
    N = read(), blocklen = sqrt(N);
    int i;
    inv[1] = 1, mul[0] = mulinv[0] = 1;
    for (i = 2; i <= 100000; ++i) inv[i] = ((MOD - MOD / i) * inv[MOD % i]) % MOD, mul[i] = (mul[i - 1] * (ll)i) % MOD; //线性求逆元
    for (i = 1; i <= 100000; ++i) mul[i] = (mul[i - 1] * i) % MOD, mulinv[i] = (mulinv[i - 1] * inv[i]) % MOD;
    for (i = 1; i <= N; ++i) Q[i].n = read(), Q[i].k = read(), Q[i].id = i, Q[i].block = Q[i].n / blocklen;
    sort(Q + 1, Q + N + 1, cmp);
    for (i = 1; i <= N; ++i)
    {
        while (pn < Q[i].n) move(3);
        while (pn > Q[i].n) move(4);
        while (pk < Q[i].k) move(1);
        while (pk > Q[i].k) move(2); 
        ans[Q[i].id] = anst;
    }
    for (i = 1; i <= N; ++i) printf("%lld\n", ans[i]);
}

Submission Info

Submission Time
Task D - 高橋君
User xielinhan
Language C++ (GCC 5.4.1)
Score 200
Code Size 2237 Byte
Status AC
Exec Time 518 ms
Memory 11392 KB

Judge Result

Set Name sub All
Score / Max Score 50 / 50 150 / 150
Status
AC × 3
AC × 6
Set Name Test Cases
sub test_02E.txt, test_03E.txt, test_05E.txt
All sample_01.txt, test_01.txt, test_02E.txt, test_03E.txt, test_04.txt, test_05E.txt
Case Name Status Exec Time Memory
sample_01.txt AC 7 ms 6272 KB
test_01.txt AC 518 ms 11392 KB
test_02E.txt AC 156 ms 11392 KB
test_03E.txt AC 114 ms 11392 KB
test_04.txt AC 45 ms 11392 KB
test_05E.txt AC 61 ms 11392 KB