首页 > 其他分享 >P8944 题解

P8944 题解

时间:2023-01-15 21:45:56浏览次数:63  
标签:dfrac 题解 LL long seed P8944 ans mod

非矩乘做法。理论上常数应该小点,但没跑进最优解第一页。可以当个好写做法看。

首先发现变换后的答案分布仅与变换前的答案分布有关。所以来研究一次变换中单点的变化。

设 \(p_u\) 表示 \(x\) 在 \(u\) 处的概率,考虑选到几个 \(u\),容易写出

\[p_u \gets \begin{cases} p'_u & \text{probability } \ \dfrac{(n-1)^2}{n^2} \\ \dfrac{\sum_{i \neq u} p'_i}{n-1} = \dfrac{1-p'_u}{n-1} & \text{probability } \ \dfrac{2(n-1)}{n^2} \\ p'_u & \text{probability } \ \dfrac{1}{n^2} \\ \end{cases} \]

\(p'_u\) 是操作前对应答案。

第一项代表两个下标均不等于 \(u\),第二项代表其中之一为 \(u\),第三项代表两项均为 \(u\)。

随便化简一下得到 \(p_u \gets \dfrac{2}{n^2} + \dfrac{n-2}{n} p'_u\)。看到这种线性递推,应该立刻想到不动点。

啥是不动点啊?

解 \(X=\dfrac{2}{n^2} + \dfrac{n-2}{n}X\) 得到 \(X=\dfrac{1}{n}\)。两边减不动点得到 \(p_u - \dfrac{1}{n} = \dfrac{n-2}{n}(p'_u - \dfrac{1}{n})\)。然后直接算就行了。\(n\) 的逆元一定存在,算起来很方便。

把 \(\left(\dfrac{n-2}{n}\right)^k\) 算出来就能 \(O(1)\) 求 \(ans_i\)。总复杂度就是线性。

本来想说也不是 dp 做法的。想了想 dp 与递推关系挺紧密的,而我觉得这偏递推,也就不这么说了。

为什么用 \(p'_u\) 是因为显然操作后的一项只与操作一次前有关。

为什么出题人要用这么一个爆 int 的膜数和刚好卡着 long long 的 \(k\) 啊?全开 unsigned long long 才过。中间一直只有 \(1\) 分一度以为自己错得离谱。

#include <cstdio>
#include <assert.h>
#define LL unsigned long long
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef long long ll;
const uint mod = 3221225473u;
const int N = 20000010;
LL qpow(LL a, ull b){
    long long ans = 1ll;
    for(; b; b >>= 1) {if(b & 1) ans = 1ll * ans * a % mod; a = 1ll * a * a % mod;}
    return ans;
}
LL inv(LL n) {return qpow(n, mod-2);}
ull seed;
ull getnext() {
    seed ^= seed << 13;
    seed ^= seed >> 17;
    seed ^= seed << 5;
    return seed;
}
uint rd(uint l, uint r) {
    return getnext() % (r - l + 1) + l;
}
int n; ull k; uint b[N];
int main() {
    scanf("%d%llu%llu", &n, &k, &seed);
    ull sum = 0;
    for (int i = 1; i < n; ++ i) b[i] = rd(2u, mod - 1), (sum += b[i]) %= mod;
    b[n] = mod + 1 - sum;
    LL ans = 0;
    LL invn = inv(n), s = qpow(invn * (n-2) % mod, k);
    for(int i = 1; i <= n; i++) {
        LL t = (long long)b[i] + mod - invn; t %= mod;
        t = t * s % mod;
        t += invn; t %= mod;
        ans ^= (t * i);
    }
    printf("%lld\n", ans);
}

标签:dfrac,题解,LL,long,seed,P8944,ans,mod
From: https://www.cnblogs.com/purplevine/p/17054188.html

相关文章

  • 【题解】P6578 [Ynoi2019] 魔法少女网站
    卡了一晚上终于过了。好家伙,又是想题想一半不会是吧,小垃圾是不是想退役/fad小黑子->小垃圾->垃圾酱->垃圾摇滚/xk但是真的有垃圾摇滚这东西/kk思路操作分块......
  • Atcoder Regular Contest ARC 153 A B C D 题解
    点我看题A-AABCDDEFE一个beautifulnumber是形如这样的:\(S1S1S3S4S5S5S7S8S7\)。如果选定了\(S1\),后面的数有100000种选法,所以先求出答案的\(S1\)。假设现在我们要求出......
  • Atcoder Regular Contest ARC 153 A B C D 题解
    点我看题A-AABCDDEFE一个beautifulnumber是形如这样的:\(S1S1S3S4S5S5S7S8S7\)。如果选定了\(S1\),后面的数有100000种选法,所以先求出答案的\(S1\)。假设现在我们要求出......
  • Atcoder Regular Contest ARC 153 A B C D 题解
    点我看题A-AABCDDEFE一个beautifulnumber是形如这样的:\(S1S1S3S4S5S5S7S8S7\)。如果选定了\(S1\),后面的数有100000种选法,所以先求出答案的\(S1\)。假设现在我们要求出......
  • 【题解】P5397 [Ynoi2018] 天降之物
    码力人的甜品,口嗨者的末路。感觉手牵手那个题才是第四分块正体,这个不如叫最初根号分治。思路根号分治。对于每个值,把它们分成出现大于根号次和小于等于根号次两类。先......
  • 【题解】P5692 [MtOI2019]手牵手走向明天
    春节前做大分块是什么奇妙传统吗……这个题好想是好想,但是写起来就是另外一回事了……思路分块。第四分块加强版。区间查询,根号分治做法寄了。看到合并颜色可以想到......
  • Codeforces 732 Div2 A-D题解
    感觉做过这场啊,要不就是看过A题AquaMoonandTwoArrays问前加后减能不能把A变成B,首先这个貌似是经典老题了,无论怎么操作数列总和不变,如果和不相同,变不了,其他情况暴力判......
  • ARC153 ABC 题解
    A【题意】给定\(N\),求第\(N\)个满足以下条件的数:它是一个\(9\)位数,没有前导\(0\)。它的第一位等于它的第二位。它的第五位等于它的第六位。它的第七位等于它......
  • XMU 2023.1.14 题解汇总
    A、CF1779A原题B、https://www.cnblogs.com/wondering-world/p/17038860.htmlC、https://www.luogu.com.cn/problem/solution/P4305D、快速幂模板点击查看代码#incl......
  • DTOJ-2023-01-02-测试-题解
    (2023省选模拟Round#4)之前感冒了一阵子,错过了两场省选模拟,不过我不打算补(乐成绩:0+42+0(就是说T1写挂了)A题目链接题目大意小\(\omega\)最近学习了分治\(\text{......