总之就是 | ZROI NOIP联测 Day9 口胡

圣诞,圣诞,圣诞节

「启」

立冬就下暴雪,好。

随便写一下,因为 C 和 D 都不想写代码了,所以就快快口胡一下吧。

缺省源使用:「V5.2」

「A」

按照 %m 来统计方案数,每次用矩阵来转移。

CI NXX(101),MXX(21),MOD(1e9+7);

struct Matrix
{
    int n,m,a[MXX][MXX];

    Matrix()
    {
        n=m=0,mst(a,0);
    }

    I void Build()
    {
        for(int i(1);i<=m;++i)
            a[i][i]=1;
    }

    I Matrix operator * (const Matrix &co) const
    {
        Matrix res;
        res.n=n,res.m=co.m;

        for(int i(1);i<=n;++i)
            for(int k(1);k<=m;++k)
                for(int j(1);j<=co.m;++j)
                    (res.a[i][j]+=(1ll*a[i][k]*co.a[k][j])%MOD)%=MOD;

        Heriko res;
    }
}

ans;

int n,m;

I Matrix MFP(Matrix x,int y)
{
    Matrix res;
    res.n=res.m=m;
    res.Build();

    while(y)
    {
        if(y&1)
            res=res*x;

        x=x*x;
        y>>=1;
    }

    Heriko res;
}

S main()
{
    Files();

    fr(n),fr(m);
    ans.n=1,ans.m=m;
    ans.a[1][m]=1;

    for(int i(1);i<=n;++i)
    {
        int x,y;
        fr(x),fr(y);
        Matrix tmp;
        tmp.n=tmp.m=m;

        for(int j(1);j<=m;++j)
            ++tmp.a[j][j],++tmp.a[j][(j+y-1)%m+1];

        ans=MFP(tmp,x)*ans;
    }

    fw((ans.a[1][m]+MOD-1)%MOD,1);

    Heriko Deltana;
}

「B」

结论题,好像有很多人是直接上了平衡树(

但是其实玩一玩就能发现,假如我们给 \([1,a_1],[a_1+1,a_2] \cdots [a_{n-1}+1,a_n]\) 这些段编上编号:\(1,2,\cdots,k\),就会发现,这些段在最后的顺序只和 \(k\) 的奇偶性相关,即偶数的时候先倒序输出偶数编号的段再顺序输出奇数段,反之先倒叙输出奇数段,再正序输出偶数段。

CI MXX(5e5+1);

int n,k,q[MXX],cnt1,cnt2;

pair<int,int> co1[MXX],co2[MXX];

char s[MXX];

S main()
{
    Files();

    fr(n),fr(k);
    scanf("%s",s+1);
    int lst(1);

    for(int i(1);i<=k;++i)
    {
        fr(q[i]);

        if(i&1)
            co1[++cnt1]=mkp(lst,q[i]);
        else
            co2[++cnt2]=mkp(lst,q[i]);

        lst=q[i]+1;
    }

    if(k&1)
    {
        for(int i(cnt1);i;--i)
            for(int j(co1[i].second);j>=co1[i].first;--j)
                putchar(s[j]);

        for(int i(1);i<=cnt2;++i)
            for(int j(co2[i].first);j<=co2[i].second;++j)
                putchar(s[j]);
    }
    else
    {
        for(int i(cnt2);i;--i)
            for(int j(co2[i].second);j>=co2[i].first;--j)
                putchar(s[j]);

        for(int i(1);i<=cnt1;++i)
            for(int j(co1[i].first);j<=co1[i].second;++j)
                putchar(s[j]);
    }

    for(int i(lst);i<=n;++i)
        putchar(s[i]);

    Heriko Deltana;
}

「C」

分讨,先把奇数的情况全加上一个 \(1\),再把 \(20\) 的情况转化为其他数组合的方案,于是就只剩下了 \(1,2,5,10\) 需要考虑。

然后考虑如何把 \(10\) 转化为其他的数字。考虑模 \(10\) 的余数,发现除了余 \(1,3,6,8\) 的时候都能有唯一的方案,然后这四种之间通过加减 \(2\) 可以最后转化为两类,然后就看要多少的 \(5,2,2,2\) 和 \(5,1.\)

没写代码,爬。

「D」

好像设涉及泰勒展开和多项式求和,这比我技能树高的不知道到哪去了(

上一篇:FreeBSD 换源方式


下一篇:day9-字符串作业