2024暑假集训测试14

news/2024/11/15 17:54:02/文章来源:https://www.cnblogs.com/Charlieljk/p/18328765

前言

  • 比赛链接。

image

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

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

T3 没学过莫反输麻了。

T1 黑暗型高松灯

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

T2 速度型高松灯

  • 原题:P3216 [HNOI2011] 数学作业。

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

\(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,但昨天赛后抢到学长最优解搞到一桶泡面,就当昨天那个是今天拿的吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773164.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章教你如何读懂 JMeter聚合报告参数!

在进行性能测试时,JMeter是一款备受推崇的开源工具。而其中的聚合报告(Aggregate Report)是我们分析测试结果、了解系统性能的重要依据。今天,我们就来深入探讨如何读懂JMeter聚合报告中的各项参数。 面对复杂的聚合报告,究竟哪些参数是我们必须关注的?这些参数背后又隐藏…

[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂

标题即摘要,暂不赘述。 如果文中有不妥或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18328759 出自【进步*于辰的博客】参考笔记一,P10.4、P13.2;笔记三,P48.1。目录先言1、通用函数2、…

Python 代码中的 yield 到底是什么?

在Python编程中,有一个强大而神秘的关键字,那就是yield。初学者常常被它搞得晕头转向,而高级开发者则借助它实现高效的代码。到底yield是什么?它又是如何在Python代码中发挥作用的呢?让我们一起来揭开它的面纱。 Python里的一个非常重要但也颇具迷惑性的关键词——yield。…

智能家居如何把老款定频空调变成智能“变频”空调#米家#智能家居#HA

背景最近长沙的天气暴热,室内达到了34-35度,天气预报最高温度上了40度,这么酷热的天气,离开了空调,基本上就是一身汗,全身湿透,特别难受,然后不得不开启家里的一台将近10年的老式定频空调,输入功率970W,OMG,一小时将近一度电,假设一天吹10小时,就是10度电,一个月…

联想电脑 win11系统,关闭联想锁屏后,windows聚焦不生效(其他电脑同理)

先排查下前置条件,然后再使用解决方案。附加:如何关闭联想锁屏: 打开联想电脑管家->工具箱->联想锁屏->关闭排查 原因1:是不是使用clash代理导致的联网问题。 解决:在clash启动"UWP应用联网限制解除工具"助手,全选,保存,等待一阵即可以正常更新屏保…

imbalanced-learn库的作用和安装

imbalanced-learn是一个Python库,‌专门用于处理不平衡数据集的机器学习问题。‌ 这个库提供了一系列的重采样技术、‌组合方法和机器学习算法,‌旨在提高在不平衡数据集上的分类性能。‌Imbalanced-learn支持欠采样、‌过采样、‌结合欠采样和过采样的方法,‌以及一些集成学…

gorm中使用乐观锁

乐观锁简介 乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略。乐观并发控制多数用于数据竞争(data race)不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。 它的作用是防止并发更…

lapce源码学习-启动过程

一、记录日志 1.1、panic恐慌(异常)记录跟踪 调用堆栈,如果有源代码信息时,则记录文件路径、行、列、堆栈;否则仅记录堆栈。 window系统,调用win32接口弹出模态框窗口提醒。1.2、链路追踪日志,输出到文件和控制台配置 文件:文件数目、文件前缀/后缀名、文件收集各目标日…

模块3 面向对象编程高级 --- 第十一章:异常处理

第十一章 异常处理 主要知识点1、异常产生的原因2、标准异常类3、Java的异常处理机制4、异常的创建5、异常的抛出6、异常语句的编程 学习目标熟悉异常产生的原因和标准异常类的用法。能够运用异常处理机制编写Java程序,提高安全性; 11.1 异常的分类一旦出现异常,系统将会立刻…

Win10资源管理器文件夹错乱

昨天晚上我不知道怎么搞得,鼠标在资源管理器界面,我手放在触控板上,不知道拖拽了啥,把所有文件搞到桌面文件夹下了。然后焦虑了一天,都打算从还原点还原了,然后今天早上更新了Windows,发现最新的还原点就在今早。。。无奈之下想到了去问问ChatGPT,然后居然它真的给了我…

[Redis]原子性

事务 为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis也不例外。 Redis的事务使用方法非常简单 不同于关系数据库我们无须理解那么多复杂的事务模型就可以直接使用。不过也正是因为这种简单性它的事务模型很不严格这要求我们不能像使用关系数据库的事…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-01 软件工具环境搭建

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1代码编…