闲话 22.8.20

闲话

好被今天T4恶心到了
而且是搞不出来的那种
看明天能不能有人搞出来吧
最新消息,lxhcr卡过去了

标签:点分治、阈值分治、多项式优化、LCA、概率与期望、代码平均200行、卡常严重

今天的歌就是《无梦之梦》了!

无梦之梦

さめないゆめを
你不想来做一场
みたくはないかい
永不醒来的梦境吗
あなたのためだけの
那儿有着一本专属于
えほんがあるよ
你自己的绘本喔
ほしがみえるよ
能够看见星星呢
そらもとべるよ
能够自由翱翔呢
すきなことをえらんでよ
可以随你喜欢来选择的喔

調子はどうですか
你最近过得还好吗
空は自由に飛べましたか
可以自由地翱翔蓝天了吗
すごい魔法が出せましたか
可以使出很厉害的魔法了吗
全部夢の中限定品さ
全是梦里的限定品呀
生きてる事ってなんだろな
活着其实是怎样的一回事啊
生きてる人は怖いからな
活着的人其实很可怕的啊
触れないものを信じるのは
去相信自己触碰不到的事物
馬鹿のすることと聞きました
听别人说只有笨蛋才会那么做
出来損ないでも良いですか
被当作废物对待也没关系吗
優しい愛を貰えますか
也能够得到温柔的爱吗
どうしようもない人間だって
就算是一无是处的人也有资格
夢を語れますか
去规划这梦想吗
夢の続きを知りたいのかい?
你想知道那个梦境的后续吧?
誰も見たこと無い絵本を
就把那谁都没读过的绘本
捲りなさい
翻开细读吧
それがあなたの
去把那里当作你
望む世界だとしよう
内心所渴望的世界吧
夢の終わりで眠ればいい
在梦的结局沉沉入睡就好

教室の廃材が宙に浮かぶ
教室的废柴正漂浮在空中
やっぱどうしたって嫌なもんは
果然不管再怎么尝试喜爱上终究
嫌なんだろうなきっと
讨厌的还是那么讨厌啊
ひとりぼっちを選べない私の
选择不了孤身一人生存的我啊
馬鹿げたモノローグ
就像在自导自演一样
不幸自慢して良いですか
我能为不幸而感到骄傲吗
最後までちゃんと聞いてますか
你有好好地听我把话全都讲完吗
なんでもう誰も居なくなったら
为什么如果谁都消失不在了的话
意味が無いんですか
一切就失去意义了呢

夢の続きを知りたいのかい?
你想知道那个梦境的后续吧?
夢の終わりが知りたくないのは
不想要去探究那梦的结尾是因为
あなたの望む世界じゃないから
那并不是你内心一直渴望的世界
こんな続きを愛して欲しい
希望你能够去爱这梦的后续

是早期的春卷饭!那个静谧的梦中世界还是一如既往地令人向往呢!
心中总是会响起这首歌的旋律。

jjdw认证的好番剧:《Slow Start》
居然有我没看过的日常番?
Aniplex + CloverWorks
彳亍今天就它了(回去我也要看看)

今天多校看到7个拿电摇当头像的人 蚌埠住了
说起来我看到电摇后最先想到的是《大吉》,ilem 的那首歌
但也不是最开始那个pv 是穆小泠的翻唱(
很魔性已经被洗脑了(

Min_25 筛例题

给定一个函数。定义其取值如下:

\[f(n) = \left \{ \begin{aligned} &1, \quad \quad & n = 1 \\ &p \oplus c & n = p^c,p为质数 \\ & f(a) \times f(b) & n = a \times b,a\bot b \end{aligned} \right. \]

给定 \(n\),求 \(\sum\limits_{i = 1}^n f(i) \pmod{998244353}\) 的值。

\(n \le 10^{10}\)

一眼积性函数用筛子求,考虑 Min_25 做法。

首先讨论质数处取值。我们发现,除 \(2\) 的质数都是奇数,因此当 \(p \neq 2\)\(p \oplus 1 = p - 1\)
考虑使用 \(\text{id}\)\(\text I\) 这两个完全积性函数相减取得原函数质数处取值。那你可能要问了,\(p = 2\) 时取值呢?
我们不管那种东西。最后额外加上2即为所求。

既然已经确定了第一部分的函数,那处理的方式就显然了。如下:

int id1[200005], id2[200005], v[200005];
int g1[200005], g2[200005];
int get(int pos) { return pos < N ? id1[pos] : id2[n / pos]; }
int S1(int val) { return val * (val + 1) / 2; }
int S2(int val) { return val; }
int F(int val, int e) { return val ^ e; }

int prime[200005], cnt; bool vis[200005];
void init() { 
    rep(i,2,N) {
        if (!vis[i]) prime[++cnt] = i; 
        rep(j,1,cnt) {
            if (i * prime[j] > N) break; 
            vis[i * prime[j]] = 1; 
            if (i % prime[j] == 0) break;
        } 
    } 
}

for (int l = 1, r; l <= n; l = r + 1) {
    r = n / (n / l); v[++m] = n / l;
    if (v[m] < N) id1[v[m]] = m;
    else id2[n / v[m]] = m;
    g1[m] = S1(v[m]) - 1;
    g2[m] = S2(v[m]) - 1;
}

rep(i,1,cnt) {
    rep(j,1,m) {
        if (1ll * prime[i] * prime[i] > v[j]) continue;
        g1[j] -= 1ll * prime[i] * (g1[get(v[j] / prime[i])] - g1[get(prime[i - 1])]);
        g2[j] -= g2[get(v[j] / prime[i])] - g2[get(prime[i - 1])];
    }
}

对于第二部分,我们直接拿两个函数相减即可。改变写法的递归求解如下:

int S(int x, int y) {
    if (prime[y] >= x) return 0;
    int ret = g1[get(x)] - g1[get(prime[y])] - g2[get(x)] + g2[get(prime[y])];
    rep(i,y+1,cnt) {
        if (1ll * prime[i] * prime[i] > x) break;
        for (register int j = 1, w = prime[i]; w * prime[i] <= x; w = w * prime[i], j++) {
            ret += 1ll * F(prime[i], j) * S(x / w, i) + F(prime[i], j+1);
        }
    } return ret;
}

printf("%lld", S(n, 0) + 3);

好写完了(

当然这题如果范围小的话也可以(近)线性筛一下
话说回来线筛比min25还难

void sieve() {
    f[1] = 1;
    rep(i,2,n) {
        if(!vis[i]) {
            prime[++cnt] = i;
            minv[i] = 1; f[i] = (i ^ 1);
        } rep(j,1,cnt) {
            int tmp = i * prime[j];
            if (tmp > n) break;
            vis[tmp] = 1;
            if (i % prime[j]) {
                f[tmp] = f[i] * f[prime[j]];
            } else {
                if (minv[i] != 0) minv[tmp] = minv[i] + 1, f[tmp] = (prime[j] ^ minv[tmp]);
                else {
                    int tmp1 = prime[j], tmp2 = i;
                    while (tmp2 % prime[j] == 0) tmp1 *= prime[j], tmp2 /= prime[j];
                    f[tmp] = f[tmp1] * f[tmp2];
                } break;
            }
        }
    }
}
posted @ 2022-08-20 21:06  joke3579  阅读(93)  评论(2编辑  收藏  举报