9.28闲话

今天晚上去看晚会了🥰🥰🥰

先说今天破事。

上午板子赛正常了点,有了左偏树、主席树这些东西,但是打的手累,妈的。

然后俩小时打完了。打了会车万,hmx 打到三面的时候 jimmy 来了,只能关了去写板子了。顺便把多项式板子封装了下,下午才搞完。

多项式板子,使用效果:码量x2,常数x2
#define LOCAL
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using PII = pair<ll, ll>;

ll read()
{
    ll x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = (x << 3) + (x << 1) + (ch ^ '0');
        ch = getchar();
    }
    return x * f;
}

ll k;

namespace Poly
{
    const int mod = 998244353;
    const int N = 3e6 + 10;
    int rev[N];
    int lim, len;
    ll qmi(ll a, ll k, ll p)
    {
        ll res = 1;
        while(k)
        {
            if(k & 1) res = res * a % p;
            a = a * a % p;
            k >>= 1;
        }
        return res;
    }

    const ll inv2 = qmi(2, mod - 2, mod);

    struct poly
    {
        vector<ll> a;
        
        ll & operator [] (int x) {return a[x]; }
        
        int deg() {return int(a.size()) - 1; }
        
        void set_deg(int _deg) {a.resize(_deg + 1); }
        
        poly() {a.clear(); }

        poly(ll x) {this -> set_deg(0); a[0] = x; }
    }a, b;

    void read(poly& x, int deg)
    {
        x.set_deg(deg);
        for(int i = 0; i <= deg; i ++ ) x[i] = ::read();
    }

    void print(poly x)
    {
        for(int i = 0; i <= x.deg(); i ++ ) printf("%lld ", x[i]);
        puts("");
    }

    poly operator + (poly a, poly b)
    {
        if(a.deg() < b.deg()) swap(a, b);
        for(int i = 0; i <= b.deg(); i ++ ) a[i] = (a[i] + b[i]) % mod;
        return a;
    }

    poly operator - (poly a, poly b)
    {
        a.set_deg(max(a.deg(), b.deg()));
        for(int i = 0; i <= b.deg(); i ++ ) a[i] = (a[i] - b[i] + mod) % mod;
        return a;
    }

    void calc(int _lim = lim, int _len = len)
    {
        for(int i = 0; i < _lim; i ++ )
            rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (_len - 1));
    }

    void init(int up)
    {
        lim = 1, len = 0;
        while(lim <= up) lim <<= 1, len ++;
        calc();
    }

    void NTT(poly &a, int opt, int _lim = lim)
    {
        for(int i = 0; i < _lim; i ++ )
            if(i < rev[i])
                swap(a[i], a[rev[i]]);
        int up = log2(_lim);
        for(int dep = 1; dep <= up; dep ++ )
        {
            int m = 1 << dep;
            ll gn = qmi(opt == 1 ? 3 : 332748118, (mod - 1) / m, mod);
            for(int k = 0; k < _lim; k += m)
            {
                ll g = 1;
                for(int j = 0; j < m / 2; j ++ )
                {
                    ll u = a[j + k];
                    ll t = a[j + k + m / 2] * g % mod;
                    a[j + k] = (u + t) % mod;
                    a[j + k + m / 2] = (u - t + mod) % mod;
                    g = g * gn % mod;
                }
            }
        }
        if(opt == -1)
        {
            ll inv = qmi(_lim, mod - 2, mod);
            for(int i = 0; i < _lim; i ++ ) a[i] = a[i] * inv % mod;
        }
    }

    poly operator * (poly a, poly b)
    {
        int n = a.deg(), m = b.deg();
        init(n + m);

        a.set_deg(lim), b.set_deg(lim);
        NTT(a, 1), NTT(b, 1);
        for(int i = 0; i < lim; i ++ ) a[i] = a[i] * b[i] % mod;
        NTT(a, -1);

        a.set_deg(n + m);
        return a;
    }

    poly operator * (poly a, ll b)
    {
        for(int i = 0; i <= a.deg(); i ++ ) a[i] = a[i] * b % mod;
        return a;
    }

    poly Inv(poly x, int n = -1)
    {
        if(n == -1) n = x.deg() + 1;
        if(n == 1)
        {
            poly res(qmi(x[0], mod - 2, mod));
            return res;
        }
        auto b = Inv(x, (n + 1) >> 1);
        
        init(n << 1);

        static poly h;
        h.set_deg(lim);
        b.set_deg(lim);
        for(int i = 0; i < lim; i ++ ) h[i] = (i < n) ? x[i] : 0;
        
        NTT(h, 1), NTT(b, 1);
        for(int i = 0; i < lim; i ++ ) 
            b[i] = (2 * b[i] % mod - h[i] * b[i] % mod * b[i] % mod + mod) % mod;
        NTT(b, -1);

        b.set_deg(n - 1);
        return b;
    }

    poly Inte(poly x)
    {
        x.set_deg(x.deg() + 1);
        for(int i = x.deg(); i >= 1; i -- ) 
            x[i] = x[i - 1] * qmi(i, mod - 2, mod) % mod;
        x[0] = 0;
        return x;
    }

    poly Deri(poly x)
    {
        for(int i = 0; i < x.deg(); i ++ )
            x[i] = x[i + 1] * (i + 1) % mod;
        x[x.deg()] = 0;
        x.set_deg(x.deg() - 1);
        return x;
    }

    poly ln(poly x)
    {
        auto res = Inte(Deri(x) * Inv(x));
        res.set_deg(x.deg());
        return res;
    }

    void exp_cdq(int l, int r, poly &f, poly &g)
    {
        if(l == r - 1)
        {
            if(l) f[l] = f[l] * qmi(l, mod - 2, mod) % mod;
            else f[l] = 1;
            return;
        }

        int mid = l + r >> 1;
        exp_cdq(l, mid, f, g);

        init((r - l));

        static poly a, b;
        a.set_deg(lim), b.set_deg(lim);
        for(int i = l; i < mid; i ++ ) a[i - l] = f[i];
        for(int i = mid - l; i < lim; i ++ ) a[i] = 0;
        for(int i = 0; i < r - l; i ++ ) b[i] = g[i];
        for(int i = r - l; i < lim; i ++ ) b[i] = 0;

        NTT(a, 1), NTT(b, 1);
        for(int i = 0; i < lim; i ++ ) a[i] = a[i] * b[i] % mod;
        NTT(a, -1);

        for(int i = mid; i < r; i ++ )
            f[i] = (f[i] + a[i - l]) % mod;
        
        exp_cdq(mid, r, f, g);
    }

    poly exp(poly x)
    {
        for(int i = 0; i <= x.deg(); i ++ ) x[i] = x[i] * i % mod;
        poly res;
        res.set_deg(x.deg());
        exp_cdq(0, x.deg() + 1, res, x);
        return res;
    }

    poly pow(poly x, ll k)
    {
        return exp(k * ln(x));
    }

    poly sqrt(poly x, int n = -1)
    {
        if(n == -1) n = x.deg() + 1;
        if(n == 1)
        {
            return poly(1);
        }
        auto b = sqrt(x, (n + 1) >> 1);
        
        static poly h;
        b.set_deg(n - 1);
        auto inv = Inv(b);

        init(n << 1);
        h.set_deg(lim);
        inv.set_deg(lim);
        b.set_deg(lim);
        for(int i = 0; i < lim; i ++ )
            h[i] = (i < n) ? x[i] : 0;
        
        NTT(inv, 1), NTT(b, 1), NTT(h, 1);
        for(int i = 0; i < lim; i ++ )
            b[i] = inv2 * (b[i] + h[i] * inv[i] % mod) % mod;
        NTT(b, -1);
        // for(int i = n; i < lim; i ++ ) b[i] = 0;
        b.set_deg(n - 1);
        return b;
    }

    poly div(poly a, poly b, poly &r)
    {
        int n = a.deg(), m = b.deg();
        poly q;
        
        static poly br;
        q.set_deg(n), br.set_deg(m);
        for(int i = 0; i <= n; i ++ ) q[i] = a[n - i];
        for(int i = 0; i <= m; i ++ ) br[i] = b[m - i];
        br.set_deg(n - m);

        auto inv = Inv(br);

        init(n << 1);
        q.set_deg(lim), inv.set_deg(lim);
        NTT(q, 1), NTT(inv, 1);
        for(int i = 0; i < lim; i ++ ) q[i] = q[i] * inv[i] % mod;
        NTT(q, -1);

        reverse(q.a.begin(), q.a.begin() + n - m + 1);
        q.set_deg(n - m);

        r = q;
        r.set_deg(lim), b.set_deg(lim);
        NTT(r, 1), NTT(b, 1);
        for(int i = 0; i < lim; i ++ ) r[i] = r[i] * b[i] % mod;
        NTT(r, -1);

        for(int i = 0; i < m; i ++ )
            r[i] = (a[i] - r[i] + mod) % mod;
        
        r.set_deg(m - 1);
        return q;
    }

    poly operator / (poly a, poly b)
    {
        int n = a.deg(), m = b.deg();
        poly q;
        
        static poly br;
        q.set_deg(n), br.set_deg(m);
        for(int i = 0; i <= n; i ++ ) q[i] = a[n - i];
        for(int i = 0; i <= m; i ++ ) br[i] = b[m - i];
        br.set_deg(n - m);

        auto inv = Inv(br);

        init(n << 1);
        q.set_deg(lim), inv.set_deg(lim);
        NTT(q, 1), NTT(inv, 1);
        for(int i = 0; i < lim; i ++ ) q[i] = q[i] * inv[i] % mod;
        NTT(q, -1);

        reverse(q.a.begin(), q.a.begin() + n - m + 1);
        q.set_deg(n - m);
        return q;
    }

    poly operator % (poly a, poly b)
    {
        poly r;
        div(a, b, r);
        return r;
    }
}

using namespace Poly;

然后摆了一下午+一晚上。

晚上就是重量级的迎新晚会了!jimmy 可能不知道这是高几的晚会,所以就让我们去了。

评价一下:男女比例严重失衡,女的极多,男的没几个,而且大部分都是最后那个节目里面所有高一老师合唱的时候出现的。

其实大部分节目都是 lyt 喜欢看的那种,好像是有汉服、街舞啥的,中间还有毕业生在唱猪猪侠和开心超人,挺热闹的,挺会整活。

但是最逆天的还是那些毕业生,上来就是两对啊啊啊啊啊啊啊啊啊啊啊啊啊啊,但是旁边还站了两对男的😋😋😋,但是这个节目最后那四对互相抱在一起啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊他妈的啊啊啊啊啊啊啊啊啊啊啊妈的啊啊啊啊啊啊啊啊啊😭😭😭😭😭😭😭😭😭😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😓😓😓😓😓😓😓😓😓😓😓😓😓😓😓😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨

他妈的。忍不了了。

开幕的时候:“最帅气,最靓的吴校长”。难绷。

好像有意思的就这些,中间 jimmy 还来了,估计是看到我们了,但是没来我们旁边。

总结就是:场面搞的没石门大,但是质量确实比石门高多了。lyt 打坤出模拟赛没去看真的亏大发了。

明天好像就放假了,只能在学校开摆了。


推歌:Arghena -Feryquitous vs Laur


不写题解了,今天摆一天了。


和昨天的图一个画师。

posted @ 2023-09-28 21:36  crimson000  阅读(52)  评论(2编辑  收藏  举报