首页 > 其他分享 >Solution - Atcoder AGC034F RNG and XOR

Solution - Atcoder AGC034F RNG and XOR

时间:2024-07-04 20:54:36浏览次数:15  
标签:Atcoder XOR limits ll RNG times cdots sum mod

考虑到这个边权是 \(\oplus\),那么说明对于 \((u, v)\),\(u\to v\) 和 \(v\to u\) 的边权实质是相同的。
那么对于 \(0\to x\),就可以反过来,记录下对应的路径,从 \(x\) 开始走,那么第一次走到 \(0\) 的时候也就是从 \(0\) 第一次走到 \(x\) 的时候。
于是就转化为了 \(x\) 为起点,第一次到达 \(0\) 的期望时间。

记 \(a_i\) 为概率,\(E(i)\) 为以 \(i\) 点为起点的期望。
那么就有 \(E(i) = \begin{cases} 0 & i = 0\\ \sum\limits_{j = 0}^{2^n - 1} a_j E(i\oplus j) + 1 & i\not = 0\end{cases}\)。
考虑到这是个 \(\oplus\) 的形式,于是可以考虑写成异或卷积的形式。
就有 \((E(0), E(1), \cdots)\times (a_0, a_1, \cdots) + (1, 1, \cdots) = (c, E(1), \cdots)\),这里的 \(\times\) 指异或卷积。
同时这里引入了一个 \(c\),这是因为实际上 \(E(0) = 0\),但是左边这一部分算出来的 \(E(0)\) 不为 \(0\),就用 \(c\) 来补足。
考虑这个 \(c\) 应该是多少,因为 \(\sum\limits_{i = 0}^{2^n - 1} a_i = 1\),所以 \((E(0), E(1), \cdots)\times (a_0, a_1, \cdots)\) 后系数和不会发生变化,那么就有 \(c = \sum\limits_{i = 0}^{2^n - 1} 1 = 2^n - 1\)。

于是有 \((E(0), E(1), \cdots)\times (a_0, a_1, \cdots) + (1, 1, \cdots) = (2^n, E(1), \cdots)\)。
考虑把 \((1, 1, \cdots)\) 移到右边,有 \((E(0), E(1), \cdots)\times (a_0, a_1, \cdots) = (2^n - 1, E(1) - 1, \cdots)\)。
发现右边项的 \(E(i)\) 系数都为 \(1\),于是可以考虑在 \(a_0\) 处 \(-1\)。
就有 \((E(0), E(1), \cdots)\times (a_0 - 1, a_1, \cdots) = (2^n - 1, -1, \cdots)\)。

然后就可以解 \(E\) 了。
但是能发现这样解出来的 \(E\) 是不唯一的。
进一步发现,可能的 \(E\) 在每一项都 \(+ k\) 也可以。
但是因为有 \(E(0) = 0\),所以 \(E(i) - E(0)\) 就是 \(i\) 的答案。

时间复杂度 \(\mathcal{O}(2^n(n + \log \text{mod}))\)。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 998244353, inv2 = mod + 1 >> 1;
inline ll qpow(ll a, ll b, ll v = 1) {
   while (b) b & 1 && ((v *= a) %= mod), (a *= a) %= mod, b >>= 1;
   return v;
}
const int maxn = 1 << 18;
int n;
inline void FWT(ll *f, ll val) {
   for (int i = 1; i <= n; i++)
      for (int j = 0; j < (1 << n); j += 1 << i)
         for (int k = 0, p = 1 << i - 1; k < p; k++) {
            ll x = f[j + k] * val % mod, y = f[j + k + p] * val % mod;
            f[j + k] = (x + y) % mod, f[j + k + p] = (mod + x - y) % mod;
         }
}
ll a[maxn], f[maxn], g[maxn];
int main() {
   scanf("%d", &n);
   ll sum = 0;
   for (int i = 0; i < (1 << n); i++) scanf("%lld", &a[i]), (sum += a[i]) %= mod;
   sum = qpow(sum, mod - 2);
   for (int i = 0; i < (1 << n); i++) (a[i] *= sum) %= mod;
   for (int i = 0; i < (1 << n); i++) f[i] = (mod - 1 + (i ? 0 : (1 << n))) % mod;
   for (int i = 0; i < (1 << n); i++) g[i] = (mod + a[i] - (i ? 0 : 1)) % mod;
   FWT(f, 1), FWT(g, 1);
   for (int i = 0; i < (1 << n); i++) (f[i] *= qpow(g[i], mod - 2)) %= mod;
   FWT(f, inv2);
   for (int i = 0; i < (1 << n); i++) printf("%lld\n", (mod + f[i] - f[0]) % mod);
   return 0;
}

标签:Atcoder,XOR,limits,ll,RNG,times,cdots,sum,mod
From: https://www.cnblogs.com/rizynvu/p/18284615

相关文章

  • AtCoder Beginner Contest 043
    D-Unbalanced只需要找到形如\(XX\)、\(XYX\)的字串即可。即两个相同字符之间最多间隔一个字符。证明:若不然,\(AXYA\),每加一个字符\(A\),都要增加多余字符\(XY\),不可能符合要求。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios......
  • AtCoder Beginner Contest 042
    C-Iroha'sObsession用一个\(\rmst\)数组把每一位标记,然后枚举大于\(n\)的数,一旦有各位都满足要求的数出现就\(\rmbreak\)。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;boolst[10];boolcheck(intx){ while(x){ intb=x%1......
  • Atcoder ABC091D Two Sequences
    首先根据\(\operatorname{xor}\),就想到拆成二进制的\(a_{i,w},b_{i,w}\)来处理。类似竖式加法,考虑把得到的结果\(c_{w}\)分为\(a_{i,w}+b_{j,w}+x\),其中\(x\)就是上一位的进位。进一步的,发现对于总的\(c_{w}\),\(a_{i,w},b_{j,w}\)肯定都在这个位置加了\(......
  • xorshift 论文解析
    论文地址//xorshiftpaper:https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf1.介绍.方法:把一个数跟他自己shift之后的数做异或.重复几次得到的数就是一个随机数.用c语言来说就是y^(y<<a)ory^(y>>a)2.理论:数学上RNG算法可以写作.我们给一个种子集合Z......
  • Atcoder ARC090F Number of Digits
    记\(n\)为题面的\(S\)。能发现对于\(f(l)=8\),共有\(9\times10^7\)个数。此时就已经有\(8\times9\times10^7>10^8=n_{\max}\)了,就说明不存在\(f\ge8\)的情况,还满足这部分对应的数能全被选满。所以可以知道对于\(f(l)\ge8\)的情况,只存在\(f(r)-f(l)=......
  • AtCoder Beginner Contest 359 (A ~F)
    A-CountTakahashiQuestion:给你n个单词,要么是Takahashi,要么是Aoki;输出有几个Takahashi即可。Code:#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineintlonglongtypedeflonglongll;typedefunsignedlonglongull;typedefpair<......
  • Atcoder ABC 360 全题解
    致歉对不起,我不应该在全题解的编写上咕咕咕两个月,导致流量大量流失。我知错了,下次还犯。AB无C考虑一个箱子里的所有球,我们需要把这些球放进互不相同的一些箱子里。然而我们可以留一个球在箱子里,显然留重量最大的最好,所以答案就是$\sum_{i=1}^{N}W_i$减去每个箱子里的最......
  • AtCoder Beginner Contest 360
    A-AHealthyBreakfast(abc360A)题目大意给定一个字符串包含RMS,问R是否在S的左边。解题思路比较R和S的下标,谁小即谁在左边。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);......
  • CF 1968 F. Equal XOR Segments (*1800) 思维
    CF1968F.EqualXORSegments(*1800)思维题意:给你一个长度为\(n\)的数组,如何可以把数组分成\(k(k>1)\)组,并且使得每组的异或和相等,那么这个数组就是完美的。现在给你\(q\)组询问,每次给你\(l,r\)。请你判断\(a_l\)到\(a_r\)之间是否是完美的。思路:对于每次询问......
  • AtCoder Beginner Contest 359
    https://atcoder.jp/contests/abc359/tasksA-CountTakahashivoidsolve(){ intn; cin>>n; intans=0; while(n--){ strings; cin>>s; if(s=="Takahashi"){ ans++; } } cout<<ans<<endl;}B-......