首页 > 其他分享 >题解:P11362 [NOIP2024] 遗失的赋值

题解:P11362 [NOIP2024] 遗失的赋值

时间:2024-12-03 22:43:09浏览次数:6  
标签:Matrix read 题解 ll cdot mod NOIP2024 P11362

这里写一个我在考场上差点想出来的、比较另类的做法。

若 \(\exists c_i=c_j(i\ne j),d_i\ne d_j\),则答案显然为 \(0\)。

否则,我们可以将序列 \(x\) 中的数分为已确定和未确定两类。

设 \(f_0(i)\) 为当 \(x_i\) 未确定时前 \(i-1\) 个二元限制的方案数,\(f_1(i)\) 为当 \(x_i\) 确定时前 \(i-1\) 个二元限制的方案数。

所以对于 \(i\not\in c,i>1\),有:

\[\begin{cases} f_0(i)=v^2\cdot f_0(i-1)+(v-1)v\cdot f_1(i-1)\\ f_1(i)=f_1(i-1)\\ \end{cases}\]

而对于 \(i\in c,i>1\) ,有:

\[\begin{cases} f_0(i)=0\\ f_1(i)=v^2\cdot f_0(i-1)+[(v-1)v-1]\cdot f_1(i-1)\\ \end{cases}\]

而对于 \(i=1\),显然有 \(f_0=[i\not\in c],f_1=[i\in c]\)。

对于每个 \(i\in c\) 单独处理,再使用矩阵快速幂优化递推即可。

点击查看代码
// Problem: P11362 [NOIP2024] 遗失的赋值(民间数据)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P11362
// Memory Limit: 512 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
ll read() {
    char c = getchar();
    int v = 0, f = 1;
    while (c < '0' || '9' < c) {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while ('0' <= c && c <= '9') {
        v = (v << 3) + (v << 1) + (c ^ 48);
        c = getchar();
    }
    return v * f;
}
const ll mod = 1e9 + 7;
const ll M = 1e5 + 5;
ll T, n, m, v;
ll c[M], d[M];
map<ll, ll> mp;
ll s[M], cnt = 0;
struct Matrix {
    ll a[2][2];
    ll &operator()(ll x, ll y) { return a[x][y]; }
} f, g;
Matrix operator*(Matrix x, Matrix y) {
    Matrix z;
    z(0, 0) = z(0, 1) = z(1, 0) = z(1, 1) = 0;
    for (ll i = 0; i < 2; i++)
        for (ll j = 0; j < 2; j++)
            for (ll k = 0; k < 2; k++)
                z(i, j) = (z(i, j) + x(i, k) * y(k, j) % mod) % mod;
    return z;
}
Matrix qpow(Matrix x, ll y) {
    Matrix z;
    z(0, 0) = z(1, 1) = 1;
    z(0, 1) = z(1, 0) = 0;
    while (y) {
        if (y & 1)
            z = z * x;
        x = x * x;
        y >>= 1;
    }
    return z;
}
void init() {
    n = read(), m = read(), v = read();
    g(0, 0) = v * v % mod, g(0, 1) = 0;
    g(1, 0) = (v - 1) * v % mod, g(1, 1) = v;
    mp.clear();
    cnt = 0;
    for (ll i = 1; i <= m; i++)
        c[i] = read(), d[i] = read();
}
void update() {
    f(0, 1) = (f(0, 0) * v % mod * v % mod +
               f(0, 1) * ((v - 1) * v % mod + 1) % mod) %
              mod;
    f(0, 0) = 0;
}
void solve() {
    for (ll i = 1; i <= m; i++) {
        if (mp.count(c[i])) {
            if (mp[c[i]] != d[i])
                ok = false;
            continue;
        }
        s[++cnt] = c[i];
        mp[c[i]] = d[i];
    }
    sort(s + 1, s + cnt + 1);
    f(1, 0) = f(1, 1) = 0;
    if (s[1] == 1)
        f(0, 0) = 0, f(0, 1) = 1;
    else {
        f(0, 0) = 1, f(0, 1) = 0;
        f = f * qpow(g, s[1] - 2);
        update();
    }
    for (ll i = 2; i <= cnt; i++) {
        f = f * qpow(g, s[i] - s[i - 1] - 1);
        update();
    }
    f = f * qpow(g, n - s[cnt]);
    ll ans = (f(0, 0) + f(0, 1)) % mod;
    printf("%lld\n", ans);
}
int main() {
    T = read();
    while (T--) {
        init();
        solve();
    }
    return 0;
}

可是洛谷上这个题的题解已经不让交了……

标签:Matrix,read,题解,ll,cdot,mod,NOIP2024,P11362
From: https://www.cnblogs.com/01bit/p/18585210

相关文章

  • NOIP2024回忆
    day-联赛的备考从暑假就开始了期间我们的一些学长回来给我们讲过一些课,比如GLR的好题选讲,树分块(没怎么听懂),生成函数,阈值分治等。他们都有光明的未来,而我们即将走上他们曾走过的道路。开学后到了新的年级,新的老师,感觉还是更加适应原来的老师。国庆后开始全面停课,但是在医院住......
  • 牛客周赛 Round 70 个人题解
    牛客周赛Round70个人题解(A~G)牛客周赛Round70A.小苯晨跑#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voidsolve(){ inta,b,c,d;cin>>a>>b>>c>>d; if(a==b&&b==c&&c==d){ cout<<&qu......
  • 题解:AT_arc139_d [ARC139D] Priority Queue 2
    题面发现我们不好算到最后还剩些什么。考虑计算\(\sum\limits_{i=1}^m\sum\limits_{j=1}^n[s_j\gei]\),容易发现这和原式等价。记\(b_i\)表示\(s\)中不小于\(i\)的数的个数,每次删去第\(x\)小的等价于将所有超过\(n-x+1\)的地方减1,加入\(k\)等价于将\(b_{1,k}\)......
  • 常见问题解决 --- nginx反向代理接口返回404
    可能原因反向代理地址写错了,还有一种可能是没有配置host请求头,导致不能正确找到服务器解决办法:修改nginx反向代理,配置虚拟主机名称,配置举例server{listen8082;server_name172.16.68.3;root/usr/local/nginx/html/;location......
  • P3750 [六省联考 2017] 分手是祝愿 题解
    P3750[六省联考2017]分手是祝愿题面ZeitundRaumtrennendichundmich.时空将你我分开。B君在玩一个游戏,这个游戏由\(n\)个灯和\(n\)个开关组成,给定这\(n\)个灯的初始状态,下标为从\(1\)到\(n\)的正整数。每个灯有两个状态亮和灭,我们用\(1\)来表示这个灯......
  • 第六届金盾信安杯Web题解
    比赛一共4道Web题,比赛时只做出三道,那道文件上传没有做出来,所以这里是另外三道题的WP分别是  fillllll_put   hoverfly  ssrffillllll_put涉及:绕过exit()死亡函数php://filter伪协议配合base64加解密 一句话木马题目源码:$content参数在开头被拼接......
  • [题解](更新中)NOIP 2024 T1~T2
    编辑字符串(edit)初见感觉像贪心,但在不好写+不会证的情况下放弃了,然后想到DP又设不出状态。实际上……就是贪心哦?下文称\(s_1,s_2\)分别为\(a,b\)。不难发现一个不存在锁定位置的区间,其内元素是可以任意交换的。所以我们可以按照锁定位置,将两个字符串划分成若干个区间(被锁定......
  • CF1778D - Flexible String Revisit 题解
    CF1778D-FlexibleStringRevisit题面给出两个长度均为\(n(n\leq10^6)\)的01串\(S\)和\(T\)每次随机将\(S\)中的某一位取反问:第一次\(S=T\)时操作次数的期望题解成环期望的小\(\text{trick}\),可以避免高斯消元和高阶递推。如果我们按照经典的期望\(dp\)......
  • 题解:CF176B Word Cut
    https://www.luogu.com.cn/problem/CF176B没看懂其他题解为什么说"可以发现,只要能从一个串变成一个串,都可以通过仅一次变换得到"。转化将题目中的操作转化一下:对于一个串\(s\),将串\(s\)复制一份接到\(s\)末尾,然后选择一段长度\(n\)的子串。发现:经过一次操作后,接下来......
  • 题解:AT_abc138_f [ABC138F] Coincidence
    https://www.luogu.com.cn/problem/AT_abc138_f对于\(x\ley\):若\(2x\ley\),则\(y-x>y\bmodx\)。若\(2x>y\),则\(y-x=y\bmodx\)。有\(x\oplusy\gey-x\)。当\(2x\ley\)时,不可能存在\(y\bmodx=x\oplusy\)了。现......