社区讨论

被卡常求助

P11362[NOIP2024] 遗失的赋值参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m446ep7d
此快照首次捕获于
2024/11/30 20:56
去年
此快照最后确认于
2024/11/30 21:03
去年
查看原帖
CPP
#include <bits/stdc++.h>
namespace FAST_IO {
const int LEN = 1 << 18;
char BUF[LEN], PUF[LEN], space = ' ', line = '\n';
int Pin = LEN, Pout;
inline void flushin() {
    memcpy(BUF, BUF + Pin, LEN - Pin), fread(BUF + LEN - Pin, 1, Pin, stdin),
        Pin = 0;
    return;
}
inline void flushout() {
    fwrite(PUF, 1, Pout, stdout), Pout = 0;
    return;
}
inline char Getc() {
    return (Pin == LEN ? (fread(BUF, 1, LEN, stdin), Pin = 0) : 0), BUF[Pin++];
}
inline char Get() { return BUF[Pin++]; }
inline void Putc(char x) {
    if (Pout == LEN)
        flushout(), Pout = 0;
    PUF[Pout++] = x;
}
inline void Put(char x) { PUF[Pout++] = x; }
template <typename tp = int> inline void read(int &X) {
    (Pin + 32 >= LEN) ? flushin() : void();
    tp res = 0;
    char f = 1, ch = ' ';
    for (; ch < '0' || ch > '9'; ch = Get())
        if (ch == '-')
            f = -1;
    for (; ch >= '0' && ch <= '9'; ch = Get())
        res = (res << 3) + (res << 1) + ch - 48;
    X = res * f;
    return;
}
template <typename tp = char> inline void read(char &X) {
    X = Getc();
    return;
}
template <typename tp> inline void wt(tp a) {
    if (a > 9)
        wt(a / 10);
    Put(a % 10 + '0');
    return;
}
template <typename tp = int> inline void write(int a) {
    static int stk[20], top;
    (Pout + 32 >= LEN) ? flushout() : void();
    if (a < 0)
        Put('-'), a = -a;
    else if (a == 0)
        Put('0');
    for (top = 0; a; a /= 10)
        stk[++top] = a % 10;
    for (; top; --top)
        Put(stk[top] ^ 48);
    return;
}
template <typename tp = char> inline void write(char a) {
    Put(a);
    return;
}
template <typename T, typename... Args> void read(T &tmp, Args &...tmps) {
    read(tmp), read(tmps...);
}
template <typename T, typename... Args> void write(T &tmp, Args &...tmps) {
    write(tmp), write(tmps...);
}
} // namespace FAST_IO
using namespace FAST_IO;
const int mod = 1e9 + 7;
int t, n, m, v, ans, lst;
struct st {
    int c, d;
} a[100002];
int qpow(int x, int y, int mod) {
    if (y < 1)
        return 1;
    int tmp = qpow(x, y / 2, mod);
    if (y & 1)
        return 1ll * x * tmp % mod * tmp % mod;
    return 1ll * tmp * tmp % mod;
}
inline int inv(int x) { return qpow(x, mod - 2, mod); }
inline int S(int x, int n) {
    return 1ll * (qpow(x, n + 1, mod) - 1) % mod * inv(x - 1) % mod;
}
void solve(int l, int r) {
    int val = S(v, 2 * (r - l) - 1) - S(v, 2 * (r - l) - r + l - 1);
    val = (val + mod) % mod;
    val = 1ll * val * (v - 1) % mod;
    val = (val + qpow(v, 2 * (r - l) - r + l, mod)) % mod;
    ans = 1ll * ans * val % mod;
}
void sol(int l, int r) {
    int val = S(v, 2 * (r - l) - 1) - S(v, 2 * (r - l) - r + l - 1);
    val = (val + mod) % mod;
    val = 1ll * val * (v - 1) % mod;
    val = (val + qpow(v, 2 * (r - l) - r + l - 1, mod)) % mod;
    ans = 1ll * ans * val % mod;
}
signed main() {
    read(t);
    for (; t--;) {
        read(n, m, v), ans = lst = 1;
        for (int i = 1; i <= m; i++)
            read(a[i].c, a[i].d);
        std::sort(a + 1, a + 1 + m, [](st x, st y) { return x.c < y.c; });
        for (int i = 1; i <= m; i++)
            if (a[i].c == a[i - 1].c && a[i].d != a[i - 1].d)
                ans = 0;
        if (!ans) {
            puts("0");
            continue;
        }
        for (int i = 1; i <= m; i++) {
            if (a[i].c == a[i - 1].c)
                continue;
            if (lst == 1 && i == 1 && a[i].c != 1)
                solve(lst, a[i].c);
            else if (a[i].c != 1)
                sol(lst, a[i].c);
            lst = a[i].c;
        }
        if (a[m].c != n)
            solve(a[m].c, n);
        printf("%d\n", ans);
    }
    return 0;
}
/*
    1 0 0 0 1
(v-1)*v*v*v*v*v*v*v
(v-1)*v*v*v*v*v*v*v
(v-1)*v*v*v*v*v*v*v
(v-1)*v*v*v*v*v*v*v
*/

回复

0 条回复,欢迎继续交流。

正在加载回复...