首页 > 其他分享 >2024暑假集训测试14

2024暑假集训测试14

时间:2024-07-28 19:50:52浏览次数:5  
标签:lfloor mu frac 14 sum rfloor 2024 ans 集训

前言

image

最可惜的一点还是本来 T3 暴力能拿 \(20\),优化成 \(15\) 了,不然就 rk2 了,晚上可能又有泡面吃了。

不过因为 T2、T4 两道水题,剩下两道不太可做(至少对于我是这样的),这两题不挂分的打的貌似都不错。

T3 没学过莫反输麻了。

T1 黑暗型高松灯

本来应该是 T4,学长特意把 T1、T4 swap 了,不可做题,学长和我们说用处不大可以不用改,是什么势能函数之类的东西,听都没没听过。

T2 速度型高松灯

做过原题?赛时忘了做过当新题做的,赛后找原题才发现做过。

设 \(t\) 表示当前数字的位数,有 \(f_x = f_{x-1} \times 10^t + x\) ,位数一样的矩阵快速幂,位数不同的两个连接点特殊处理即可。

对于位数一样的,有:

\[\begin{bmatrix} dp_i\\ i\\ 1 \end{bmatrix} = \begin{bmatrix} 10^k & 1 & 1\\ 0 & 1 & 1\\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} dp_{i-1}\\ i-1\\ 1 \end{bmatrix} \]

我这个做法不开 __int128 会炸。

点击查看代码
#include<bits/stdc++.h>
#define ll __int128
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=1e5+10;
template<typename Tp> inline void read(Tp&x)
{
    x=0;register bool z=true;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
    for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    x=(z?x:~x+1);
}
template<typename Tp> inline void wt(Tp x)
{if(x>9)wt(x/10);putchar((x%10)+'0');}
template<typename Tp> inline void write(Tp x)
{if(x<0)putchar('-'),x=~x+1;wt(x);}
ll n,m,P,a[10][10],ans[10][10],c[10][10],last,ans1,ans2,anss;
ll qpow(ll a,ll b)
{
    ll ans=1;
    for(;b;b>>=1)
    {
        if(b&1) ans*=a;
        a*=a;
    }
    return ans;
}
void qpow(ll b)
{
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=3;i++) ans[i][i]=1;
    for(;b;b>>=1)
    {
        if(b&1)
        {
            for(int i=1;i<=3;i++)
                for(int j=1;j<=3;j++)
                    for(int k=1;k<=3;k++)
                        (c[i][j]+=(ans[k][j]*a[i][k])%P)%=P;
            for(int i=1;i<=3;i++)
                for(int j=1;j<=3;j++)
                {
                    ans[i][j]=c[i][j];
                    c[i][j]=0;
                }
        }
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                for(int k=1;k<=3;k++)
                    (c[i][j]+=(a[i][k]*a[k][j])%P)%=P;
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
            {
                a[i][j]=c[i][j];
                c[i][j]=0;
            }
    }
}
signed main()
{
    read(n),read(P);
    ll y=n;
    while(y) {m++; y/=10;}
    for(int i=1;i<=m;i++)
    {
        ll t=qpow(10,i);
        a[1][1]=t,a[2][1]=1,a[3][1]=1;
        a[1][2]=0,a[2][2]=1,a[3][2]=1;
        a[1][3]=0,a[2][3]=0,a[3][3]=1;
        ll x=t/10;
        if(i!=m) qpow(t-x-2);
        else 
        {
            if(n>x) qpow(n-x-1);
            else 
            {
                anss=((last*t)%P+x)%P;
                break;
            }
        }
        ans2=((last*t)%P+x)%P;
        ans1=((ans2*t)%P+x+1)%P;
        anss=(((ans1*ans[1][1])%P+((x+1)*ans[2][1])%P)%P+1*ans[3][1])%P;
        last=anss;
    }
    write(anss);
}

T3 力量型高松灯

  • 原题:P6156 简单题,加强版:P6222 「P6156 简单题」加强版

  • 部分分 \(20pts\):\(O(n^2\log n)\) 暴力,预处理可到 \(O(n^2)\)。

  • 正解:

    大多数人能一眼看出莫反,到我没学过,赛后找了篇博客但没认真学,就看了看到把题解看懂的地步,有时间再系统学。

    就看到了一个 \((\sum\limits_{d|n}\mu(d))=[n=1]\) 做这题有用的,剩下的都是套路。

    \[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\mu^2(\gcd(i,j))\gcd(i,j)\\ =&\sum_{d=1}^n\mu^2(d)d\sum_{i=1}^n\sum_{j=1}^n(i+j)^k[\gcd(i,j)=d]\\ =&\sum_{d=1}^n\mu^2(d)d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}(d(i+j))^k[\gcd(i,j)=1]\\ =&\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}(i+j)^k[\gcd(i,j)=1]\\ =&\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}(i+j)^k\sum_{e|i,e|j}\mu(e)\\ =&\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac n{de}\rfloor}\sum_{j=1}^{\lfloor\frac n{de}\rfloor}(e(i+j))^k\sum_{e|i,e|j}\mu(e)\\ =&\sum_{e=1}^n\mu(e)e^k\sum_{d=1}^{\lfloor\frac ne\rfloor}\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac n{de}\rfloor}\sum_{j=1}^{\lfloor\frac n{de}\rfloor}(i+j)^k\\ =&\sum_{T=1}^nS\left(\left\lfloor\frac nT\right\rfloor\right)T^k\sum_{d|T}\mu^2(d)\mu\left(\frac Td\right)d \end{aligned} \]

    其中 \(S(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^k\)。

    问题来到怎么求 \(S(n)\) 和它后面那一坨。

    先求后面那一坨,设 \(f(n)=\sum\limits_{d|T}\mu^2(d)\mu\left(\frac Td\right)d\),因为其内部均为积性函数,故 \(f(n)\) 也是积性函数,对于质数 \(p\),其次方为 \(c\) 。

    • 若 \(c=1\),满足积性。
    • 若 \(c=2\),\(f(p^2)=\mu^2(p^2)\mu(1)p^2+\mu^2(p)\mu(p)p+\mu^2(1)\mu(p^2)\times 1=-p\)。】
    • 若 \(c>2\),任意组合均能使 \(\mu(d),\mu(\frac Td)\) 中的一个为 \(0\),故结果一定为 \(0\)。

    线性筛的时候直接处理即可。

    来看 \(S(n)\),设 \(F(n)=\sum\limits_{i=1}^ni^k\),\(G(n)=\sum\limits_{i=1}^nF(i)\),那么有 \(S(n)=G(2n)-2G(n)\),证明比较显然,可以手摸一下,也可以数学归纳。

    由于 \(i^k\) 也是积性函数,筛的时候直接处理即可。

    最后数论分块处理答案即可。

    点击查看代码
    #include<bits/stdc++.h>
    #define ll long long 
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=1e7+10,P=998244353;
    template<typename Tp> inline void read(Tp&x)
    {
        x=0;register bool z=true;
        register char c=getchar();
        for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
        for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
        x=(z?x:~x+1);
    }
    template<typename Tp> inline void wt(Tp x)
    {if(x>9)wt(x/10);putchar((x%10)+'0');}
    template<typename Tp> inline void write(Tp x)
    {if(x<0)putchar('-'),x=~x+1;wt(x);}
    ll n,k,tot,cnt,ans,prime[N],f[N],g[N];
    bool vis[N];
    ll qpow(ll a,ll b)
    {
        ll ans=1;
        for(;b;b>>=1)
        {
            if(b&1) (ans*=a)%=P;
            (a*=a)%=P;
        }
        return ans;
    }
    void sieve()
    {
        f[1]=g[1]=1;
        for(int i=2;i<=2*n;i++)
        {
            if(!vis[i])
            {
                prime[++tot]=i;
                f[i]=i-1;
                g[i]=qpow(i,k);
            }
            for(int j=1;j<=tot&&i*prime[j]<=2*n;j++)
            {
                vis[i*prime[j]]=1;
                g[i*prime[j]]=g[i]*g[prime[j]]%P;
                if(i%prime[j]==0)
                {
                    if((i/prime[j])%prime[j]!=0)
                        f[i*prime[j]]=(P-prime[j])*f[i/prime[j]]%P;
                    break;
                }
                f[i*prime[j]]=f[i]*f[prime[j]]%P;
            }
        }
        for(int i=2;i<=2*n;i++) 
        {
            f[i]=(f[i-1]+f[i]*g[i]%P)%P;
            g[i]=(g[i-1]+g[i])%P;
        }
        for(int i=2;i<=2*n;i++) g[i]=(g[i-1]+g[i])%P;
    }
    ll s(ll x)
    {
        return (g[x<<1]-2*g[x]%P+P)%P;
    }
    signed main()
    {
        read(n),read(k);
        sieve();
        for(ll l=1,r=0;l<=n;l=r+1)
        {
            r=n/(n/l);
            (ans+=s(n/l)*((f[r]-f[l-1]+P)%P)%P)%=P;
        }
        write(ans);
    }
    

T4 高松灯

看题名就知道签到题,要么取自己要么第一位取次大值后面全取 \(9\),但我赛时想都没想搞了个数位 DP 上去。

总结

没学过的知识点还是太多,这次只挂了 \(5pts\) 而且打的不是很唐,所以好像没啥心得,好多题逆推退不出来想想正推,反过来也是,T2 倒推半天出不来正推直接过了。

附录

虽然今天可惜没拿到 rk2,但昨天赛后抢到学长最优解搞到一桶泡面,就当昨天那个是今天拿的吧。

标签:lfloor,mu,frac,14,sum,rfloor,2024,ans,集训
From: https://www.cnblogs.com/Charlieljk/p/18328765

相关文章

  • Solution - Atcoder ARC114F Permutation Division
    令\(a\)为题目中的\(P\)。首先考虑后手的重排策略是什么。因为\(a\)是个排列,元素互不相同,那么肯定就是按照每一段的第一个数的大小,越大的放在越前面。那么当\(a_1\lek\)的时候,显然先手会把以\(1\simk\)开头来划分段。因为否则存在一个开头\(>k\)的段,后手把其放......
  • 2024/07/28 每日一题
    LeetCode699掉落的方块方法1:暴力classSolution:deffallingSquares(self,positions:List[List[int]])->List[int]:n=len(positions);ans=[0]*n#记录每个方块落下后的高度fori,(left0,widen0)inenumerate(positions):......
  • 暑假集训csp提高模拟10
    赛时rank19,T10,T225T310T4100T3挂了10pts?数学专场,套路专场,烧脑专场。幸亏我还有缓存的李超树博客,最后一个小时就溜了去打数据结构。数学好难,拜谢数学。T1黑暗型高松灯CompanyAcquisitions要用势能分析,鞅的停时定理。由于赛时这个放T1非常逆天,所以整场比赛的奖......
  • 大创项目个人周报(2024.7.22—2024.7.28)
    本周个人情况汇报我本周主要学习了安卓开发的内容,根据《第一行代码Android》开展了学习。一、分析自己的第一个Android程序通过看书,我对项目的各个文件的功能有了大致了解,除app目录外,大多数文件和目录是自动生成的,app目录是今后开发工作主要涉及的部分。app的结构如下。......
  • 2024牛客多校第四场F.Good Tree 挑战全网最详解
    好吧标题党了一回,但我相信有不少人被出题人的那句“手玩一下就知道了”无语住了像我这种憨憨一旦想偏了就救不回来了,于是困惑了好久,在雨巨的指导下彻底搞懂(此处大声谢谢雨巨,又有实力又会讲题又认真答疑每一个问题,呜呜呜我永远的姐)题意简单来说就是定义f(i)为树上i点到其他所有......
  • 『模拟赛』暑假集训CSP提高模拟10
    RankA.黑暗型高松灯原[CF1025G]CompanyAcquisitions第一题直接上黑。B.速度型高松灯原[HNOI2011]数学作业想递推来着,但确实没考虑矩阵加速。对矩阵的掌握感觉也没那么好了,找机会复习得。按照下发题解里的矩阵是这样的:\[\begin{bmatrix}dp_i\\i+1\\1\end{bma......
  • 暑假集训第一周专题:树
    暑假集训第一周专题:树本专题其实还是看中对题目的阅读理解能力,dfs实现起来很简单,主要是知道题目到底要干嘛A.KuroandWalkingRoute题面输入输出思路即所有路线减去经过x到y的路线由x到y的路线,包括从某些点到x,经过一些点再到y,从y再到某些点有根据题目......
  • ssy暑假集训暴力算法学习笔记
    7.28集训第六天今天t大学的学长peop1e来给我们讲课啦!人好帅呀嘿嘿嘿....内容如下模拟退火:定义模拟退火可以分成两个部分,一个是"模拟",一个是"退火",先介绍什么叫退火,贴一张百度百科的图吧:\(\\\)那这"退火"的定义有啥用吗?模拟退火就是用来模拟整个退火的过程(其实没啥相似......
  • BI-LSTM+Attention 的 tensorflow-1.14 实现
    这里只是用简单例子演示关于self-attention的逻辑,判断一句话的情感是正面或者是负面,具体原理自己百度即可。importtensorflowastfimportnumpyasnptf.reset_default_graph()#词向量维度dim=2#隐层大小hidden=5#时间步大小step=3#情感类别正面......
  • Adobe Photoshop 2024 v25.11 (macOS, Windows) - 照片和设计软件
    AdobePhotoshop2024v25.11(macOS,Windows)-照片和设计软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD......