[数学记录]abc276G Count Sequences

题意:对满足以下条件的序列计数,膜 998244353

  • 0a0a1anm
  • aiaj(mod3)

这题的难点在于发现它是简单题。

想了一上午生成函数啊(

不等于很难处理,所以做一遍差分,令 n 自增 1,题意转化为:bi=mbi0i[2,n1] 成立。

然后就会发现等价于求 [xm](11x)2(11x11x3)n2,然后怎么算呢,我也不会啊hh

首先,数字的个数是一定的,这意味着其实可以只关注膜 3 余数。

为了处理回剩余数,应把多于的 3 分配到剩下数。

能发现中间的数的取值只有 1/2,这意味着枚举几个 2 是完全可接受的。

此时同时枚举第一个数,最后一个数便会随之确定。

做完了。这是黄?我不信。

#include <cstdio>
using namespace std;
const int M = 1e7+5, mod = 998244353;
int qpow(int a, int b){
    long long ans = 1ll;
    for(; b; b >>= 1) {if(b & 1) ans = 1ll * ans * a % mod; a = 1ll * a * a % mod;}
    return ans;
}
int inv(int k) {return qpow(k, mod - 2);}
int addd(int a, int b) {a += b; return a > mod ? a-mod : a;}
int minus(int a, int b) {a -= b; return a < 0 ? a+mod : a;}
void add(int &x, int y) {x += y; if(x > mod) x -= mod;}
int fact(int x) {int ans = 1; for(int i = 1; i <= x; i++) ans = 1ll * ans * i % mod; return ans;}
int fac[M], invfac[M], invn[M];
void pre(int n = M - 3){
    fac[0] = invfac[0] = fac[1] = invfac[1] = invn[1] = 1;
    for(int i = 2; i <= n; i++)
        invn[i] = 1ll * (mod - mod/i) * invn[mod%i] % mod,
        fac[i] = 1ll * fac[i-1] * i % mod,
        invfac[i] = 1ll * invfac[i-1] * invn[i] % mod;
}
int C(int n, int m) {return m > n ? 0 : 1ll * fac[n] * invfac[m] % mod * invfac[n-m] % mod;}
int n, m, ans;
int main(){
    pre(); scanf("%d %d", &n, &m);
    ++n;
    for(int i = 0; i <= n-2; i++) {
        int j = n - 2 - i;
        for(int s = 0; s < 3; s++) {
            int t = (m - 2*i - j - s) % 3;
            if(t < 0) continue;
            int res = m - 2*i - j - t - s; res /= 3;
            add(ans, 1ll * C(n-2, i) * C(res + n - 1, n - 1) % mod);
        }
    } 
    printf("%d\n", ans);
}

upd 11/13

在 Luogu 上看到 一个生成函数题解,最后的式子也化到了自己卡住那步,把后面的来补全一下。

要求的即为

[xm](x2+x1x3)n21(1x)2=[xmn+2](x+1)n2(1x3)n21(1x)2

1(1x)2 相当于对前面的东西弄个二维前缀和,而

(x+1)n2=m0(n2m)xm1(1x3)n2=m0(n3+mm)x3m

先把两者中的一者卷个 1(1x)2 再和另一者卷起来即可,因为只需要一项,不需要 NTT,总时间复杂度线性。

作者:purplevine

出处:https://www.cnblogs.com/purplevine/p/16867616.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   purplevine  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示