<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Martian148</title><description>Stay hungry, stay foolish</description><link>https://astro-pure.js.org</link><item><title>【算法题解】AND-array</title><link>https://astro-pure.js.org/blog/xcpc-solution-and-array</link><guid isPermaLink="true">https://astro-pure.js.org/blog/xcpc-solution-and-array</guid><description>Codeforces 2211D 题解：已知所有 k-长子序列按位与之和 mod 1e9+7，按位拆解后用组合数还原原数组。</description><pubDate>Fri, 03 Jul 2026 23:33:00 GMT</pubDate><content:encoded>&lt;h4&gt;Question&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://codeforces.com/contest/2211/problem/D&quot;&gt;CF2211D AND-array&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对于一个长度为 $n$ 的序列 $a$，我们定义其 AND 数组 $f(a)$ 如下：&lt;/p&gt;
&lt;p&gt;$$
f(a)&lt;em&gt;k = \sum\limits&lt;/em&gt;{1 \le i_1 \lt i_2 \lt \ldots \lt i_k \le n} a_{i_1} &amp;#x26; a_{i_2} &amp;#x26; \ldots &amp;#x26; a_{i_k}
$$&lt;/p&gt;
&lt;p&gt;换句话说，$f(a)_k$ 是对序列 $a$ 中所有长度为 $k$ 的子序列的元素按位与的和。&lt;/p&gt;
&lt;p&gt;序列 $a$ 对你而言是未知的。但你被提供了一个长度为 $n$ 的序列 $b$，满足对所有 $1 \le i \le n$，都有 $b_i \equiv f(a)_i \pmod{10^9 + 7}$。你的任务是基于给定的序列 $b$ 还原序列 $a$。&lt;/p&gt;
&lt;p&gt;$$
1\le n\le 10^5, 0\le b_i\le 10^9+7,0\le a_i&amp;#x3C;2^{29}
$$&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;我们设二进制的第 $p$ 位在数组 $a$ 中出现了 $c_p$ 次，那么对于一个长度为 $k$ 的子序列，它的 AND 在第 $p$ 位为 $1$ 的选法有&lt;/p&gt;
&lt;p&gt;$$
\binom{c_p}{k}
$$&lt;/p&gt;
&lt;p&gt;种，所以第 $p$ 位对 $f(a)_k$ 的贡献就是&lt;/p&gt;
&lt;p&gt;$$
2^{p} \cdot\binom{c_{p}}{k}
$$&lt;/p&gt;
&lt;p&gt;于是&lt;/p&gt;
&lt;p&gt;$$
b_{k} \equiv f(a)&lt;em&gt;{k} \equiv \sum&lt;/em&gt;{p=0}^{28} 2^{p}\binom{c_{p}}{k} \quad\left(\bmod 10^{9}+7\right)
$$&lt;/p&gt;
&lt;p&gt;这就是整题的本质。&lt;/p&gt;
&lt;p&gt;现在我们要把每个 $c_p$ 求出来&lt;/p&gt;
&lt;p&gt;倒着枚举 $k = n, n-1, \ldots, 1$。&lt;/p&gt;
&lt;p&gt;因为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 $c_p &amp;#x3C; k$，那么 $\binom{c_p}{k} = 0$&lt;/li&gt;
&lt;li&gt;如果 $c_p = k$，那么 $\binom{c_p}{k} = 1$&lt;/li&gt;
&lt;li&gt;如果 $c_p &gt; k$，那么它的贡献可以用之前已经知道的 $c_p$ 算出来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以对当前 $k$，先把所有 $c_p &gt; k$ 的贡献减掉：&lt;/p&gt;
&lt;p&gt;$$
x_k = b_k - \sum_{c_p &gt; k} 2^p \binom{c_p}{k} \quad (\bmod\ MOD)
$$&lt;/p&gt;
&lt;p&gt;那么剩下的就是：&lt;/p&gt;
&lt;p&gt;$$
x_k = \sum_{c_p = k} 2^p
$$&lt;/p&gt;
&lt;p&gt;于是我们看 $x_k$ 的哪一位为 $1$ 就代表这一位对应的 $c_p=k$&lt;/p&gt;
&lt;p&gt;现在我们得到了 $c_p$ 要构造数组，暴力能放就放就好了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &amp;#x3C;bits/stdc++.h&gt;
using namespace std;
using ll = long long;
const ll MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;
ll Fac[MAXN], InvFac[MAXN];

ll pow(ll a, ll b) {
    ll res = 1;
    while (b) {
        if (b &amp;#x26; 1) res = res * a % MOD;
        a = a * a % MOD;
        b &gt;&gt;= 1;
    }
    return res;
}

void init() {
    Fac[0] = 1;
    for (int i = 1; i &amp;#x3C; MAXN; i++) Fac[i] = Fac[i - 1] * i % MOD;
    InvFac[MAXN - 1] = pow(Fac[MAXN - 1], MOD - 2);
    for (int i = MAXN - 2; i &gt;= 0; i--) InvFac[i] = InvFac[i + 1] * (i + 1) % MOD;
}

ll C(int n, int m) {
    if (m &gt; n || m &amp;#x3C; 0) return 0;
    return Fac[n] * InvFac[m] % MOD * InvFac[n - m] % MOD;
}

void solve() {
    int n; cin &gt;&gt; n;
    vector&amp;#x3C;ll&gt; b(n + 1);
    vector&amp;#x3C;ll&gt; cnt(29, 0);
    for (int i = 1; i &amp;#x3C;= n; i++) cin &gt;&gt; b[i];
    for (int k = n; k &gt;= 1; k--) {
        ll val = b[k];
        for (int j = 0; j &amp;#x3C; 29; j++) {
            val -= (1LL &amp;#x3C;&amp;#x3C; j) * C(cnt[j], k) % MOD;
            val = (val % MOD + MOD) % MOD;
        }

        for (int j = 0; j &amp;#x3C; 29; j++) 
            if (val &gt;&gt; j &amp;#x26; 1) {
                cnt[j] = k;
            }
    }

    vector&amp;#x3C;ll&gt; a(n + 1);
    for (int i = n; i &gt;= 1; i--) {
        for (int j = 0; j &amp;#x3C; 29; j++) {
            if (cnt[j] &gt; 0) a[i] += 1LL &amp;#x3C;&amp;#x3C; j, cnt[j]--;
        }
    }
    

    for (int i = 1; i &amp;#x3C;= n; i++) cout &amp;#x3C;&amp;#x3C; a[i] &amp;#x3C;&amp;#x3C; &quot; \n&quot;[i == n];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    init();
    int t; cin &gt;&gt; t;
    while (t--) solve();
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>如何发布一篇博客</title><link>https://astro-pure.js.org/blog/how-to-publish-a-blog</link><guid isPermaLink="true">https://astro-pure.js.org/blog/how-to-publish-a-blog</guid><description>记录在这个 Astro 个人网站中，从写作到发布一篇博客的完整流程。</description><pubDate>Fri, 03 Jul 2026 20:30:00 GMT</pubDate><content:encoded>&lt;h2&gt;写在前面&lt;/h2&gt;
&lt;p&gt;这个网站的博客文章放在 &lt;code&gt;src/content/blog/&lt;/code&gt; 目录下。每一篇文章本质上都是一个 Markdown 文件，写好内容之后，网站会自动把它渲染成博客页面。&lt;/p&gt;
&lt;p&gt;如果文章不需要图片，只创建一个 &lt;code&gt;.md&lt;/code&gt; 文件就可以；如果文章需要配图或其他资源，可以创建一个同名文件夹，把文章写在里面的 &lt;code&gt;index.md&lt;/code&gt; 中。&lt;/p&gt;
&lt;h2&gt;创建文章&lt;/h2&gt;
&lt;p&gt;最简单的方式是在 &lt;code&gt;src/content/blog/&lt;/code&gt; 下面新建一个 Markdown 文件，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;src/content/blog/my-new-blog.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件名会影响文章链接。比如这个文件最终会生成类似这样的路径：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;/blog/my-new-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你希望链接更清晰，可以用英文短横线命名，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;how-to-learn-llm.md
reading-notes-transformer.md
my-first-project.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;编写 Frontmatter&lt;/h2&gt;
&lt;p&gt;每篇博客开头都需要写一段配置，叫做 Frontmatter。它用来描述文章标题、发布时间、摘要、标签等信息。&lt;/p&gt;
&lt;p&gt;一个基本模板如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: 我的新博客
publishDate: 2026-07-03 20:00:00
description: &apos;这是一篇文章摘要，会出现在博客列表或搜索结果中。&apos;
tags:
  - blog
  - life
language: &apos;中文&apos;
draft: false
comment: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用字段含义：&lt;/p&gt;
&lt;p&gt;| 字段 | 作用 |
| --- | --- |
| &lt;code&gt;title&lt;/code&gt; | 文章标题 |
| &lt;code&gt;publishDate&lt;/code&gt; | 发布时间 |
| &lt;code&gt;description&lt;/code&gt; | 文章简介 |
| &lt;code&gt;tags&lt;/code&gt; | 文章标签 |
| &lt;code&gt;language&lt;/code&gt; | 文章语言 |
| &lt;code&gt;draft&lt;/code&gt; | 是否为草稿 |
| &lt;code&gt;comment&lt;/code&gt; | 是否开启评论 |&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;draft: true&lt;/code&gt;，这篇文章通常不会作为正式文章发布。写完准备公开时，把它改成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;draft: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果暂时不想开启评论，可以写：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;comment: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;编写正文&lt;/h2&gt;
&lt;p&gt;Frontmatter 下面就是正文。正文使用 Markdown 语法，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;## 第一节标题

这里写正文内容。

### 小标题

- 列表项一
- 列表项二

```ts
console.log(&apos;Hello, blog!&apos;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写博客时可以先把内容分成几个部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;这篇文章想解决什么问题&lt;/li&gt;
&lt;li&gt;背景是什么&lt;/li&gt;
&lt;li&gt;具体过程是什么&lt;/li&gt;
&lt;li&gt;自己有什么理解或总结&lt;/li&gt;
&lt;li&gt;以后还想继续探索什么&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样文章会更清楚，也更容易坚持写下去。&lt;/p&gt;
&lt;h2&gt;预览文章&lt;/h2&gt;
&lt;p&gt;本地启动开发服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后打开：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;http://localhost:4321/blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果文章已经显示在博客列表中，说明它被网站识别到了。点击文章标题，就可以进入详情页预览排版。&lt;/p&gt;
&lt;p&gt;如果没有显示，可以检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件是否放在 &lt;code&gt;src/content/blog/&lt;/code&gt; 下&lt;/li&gt;
&lt;li&gt;Frontmatter 有没有语法错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;draft&lt;/code&gt; 是否被设置成了 &lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件扩展名是不是 &lt;code&gt;.md&lt;/code&gt; 或 &lt;code&gt;.mdx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;发布到线上&lt;/h2&gt;
&lt;p&gt;本地确认没有问题后，先运行一次构建：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun run build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果构建通过，就可以提交代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;Add new blog post&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推送到 GitHub 后，Vercel 会自动重新部署网站。部署完成后，线上博客页面就会出现这篇新文章。&lt;/p&gt;
&lt;h2&gt;一个建议&lt;/h2&gt;
&lt;p&gt;刚开始写博客时，不必追求每篇都很完整。可以先把博客当作自己的学习记录：今天学到了什么，遇到了什么问题，最后怎么解决的。&lt;/p&gt;
&lt;p&gt;长期来看，这些零散记录会慢慢连成一条线。它会记录你如何理解技术，也会记录你如何理解自己。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>我的第一篇博客</title><link>https://astro-pure.js.org/blog/my-frist-blog</link><guid isPermaLink="true">https://astro-pure.js.org/blog/my-frist-blog</guid><description>记录一下这个个人网站的第一篇文章。</description><pubDate>Fri, 03 Jul 2026 20:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;开始&lt;/h2&gt;
&lt;p&gt;这是我的第一篇博客。&lt;/p&gt;
&lt;p&gt;测试博客&lt;/p&gt;
&lt;h1&gt;H1&lt;/h1&gt;
&lt;h2&gt;H2&lt;/h2&gt;
&lt;h3&gt;H3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无序列表&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;有序列表&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>