当前位置: 首页 > news >正文

OI 笑传 #5

这场模拟赛是打过的感觉最好的一场模拟赛,虽然也挂了分但是从每个题里面都能或多或少的学到点什么。

写这个的时候已经忘了赛时干过什么了,来看题吧。

T1

场切了,但是貌似挂了不少人的分?

考虑 \(\gcd(a,b)\)\(\operatorname{lcm}(a,b)\) 的实质,我们把 \(a,b\) 质因数分解为 \(a=p_1^{i_1}p_2^{i_2}p_3^{i_3}\cdots\)\(b=p_1^{j_1}p_2^{j_2}p_3^{j_3}\cdots\),于是有:

\[\gcd(a,b)=p_1^{\min(i_1,j_1)}p_2^{\min(i_2,j_2)}p_3^{\min(i_3,j_3)}\cdots \]

\[\operatorname{lcm}(a,b)=p_1^{\max(i_1,j_1)}p_2^{\max(i_2,j_2)}p_3^{\max(i_3,j_3)}\cdots \]

回到这个题,我们先把 \(x\) 质因数分解:\(x=p_1^{k_1}p_2^{k_2}p_3^{k_3}\cdots\)

首先如果 \(p=1\),那么当然只有自己是合法的,答案是 \(1\)

如果 \(p>1\),我们可以改变通过改变 \(x\) 的某个 \(p_i\) 上的 \(k_i\)\(k_i\times p\)\(\frac{k_i}{p}\) 来构造 \(y\),改变为后者的条件是 \(k_i\) 可被 \(p\) 整除。

这里要理解一下,通过上面的式子手摸一下就明白了。

于是质因数分解完对于每一位乘法原理计算即可。注意特判 \(p=1\)

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
bool ispr[1000005];
int pl[1000005];
bitset<1000000> vis; 
int num=0;
bool j(ll s){for(int i=2;i*i<=s;i++){if(s%i==0)return 0;}return 1;
}
void es(int n){memset(ispr,1 ,sizeof ispr);ispr[1]=0;for(int i=2;i<=n;i++){if(ispr[i])pl[++num]=i; for(int j=1;j<=num&&i*pl[j]<=n;j++){ispr[i*pl[j]]=0;if(i%pl[j]==0)break;}}
}
map<ll,ll> mp;
void diver(ll x){int c=1;while(x){if(j(x)){mp[x]++;break;}if(x%pl[c]==0){x/=pl[c];mp[pl[c]]++;}else c++;}return ;
}
int main(){// freopen("count.in","r",stdin);// freopen("count.out","w",stdout);ll x,p;cin>>x>>p;if(p==1){cout<<1;return 0;}es(1e5);diver(x);ll ans=1;for(auto v:mp){if(v.second%p==0)ans*=2;}cout<<ans;return 0;
}

T2

有一种做法是优先队列存下来两两相邻的数加和的最大值,考虑每次删去产生了最大值的那一对元素中较大的那一个,因为只有这样才可能让答案更优,即使删去后序列的权值变大。

赛时我还注意到了一个性质:如果我们能够构造出一个长度 \(\ge m\) 的,权值小于给定值的串,我们一定可以通过每次删去序列中最大值的方式,来将其变成一个长度正好为 \(m\) 的,权值小于给定值的串。

证明反证即可。

然后问题变成了给定一个权值 \(k\),我们能构造出的最长的符合要求的串的长度是多少。

这里是最恶心的地方,因为题目中要求是一个环,不能直接贪心了。如果直接 DP 会有 \(O(n^3)\) 的时间复杂度。

有个很重要的观察是:在最长的符合要求的串中,序列的最小值是一定在串中的。

原因是因为是全局最小值,换成序列里的其它值一定不优。

于是我们完全可以钦定最长串的开头是最小值,也就是在最小值处断环成链,接下来想想怎么贪心。

还有一个好玩的小技巧是我们根据 \(\left \lfloor \frac{k}{2} \right \rfloor\) 的大小把序列的权值分类,接下来所有的权值 \(\le \left \lfloor \frac{k}{2} \right \rfloor\) 的元素都可以之间选进合法序列里去了,原因显然。

接下来考虑已经放进去的元素之间那些段里面权值 \(\ge \left \lfloor \frac{k}{2} \right \rfloor\),我们尝试把里面最小的元素放进去,如果这个元素和两边的加和 \(\le k\),那么可以放进去,反正不能,如此贪心即可。

但是 code 还没调过,可能不会再调了罢。

code

Show me the code

http://www.sczhlp.com/news/5395/

相关文章:

  • HomeAssistant 接入贝锐向日葵智能设备
  • Go 实现插件系统
  • 1.8 axios详解 - 详解
  • B 站海外上线 AI 原声翻译功能,还原 UP 主声线;Salient 融资 6000 万美元,打造贷款语音智能体丨日报
  • 2025暑假广铁一中集训记 - 雨梦
  • 学习理论:代理损失函数的泛化界与Rademacher复杂度 - orion
  • 集训内容总结 day5:dp 优化
  • 集训内容总结 day6:数论
  • Maui 实践:自制轻量级通知组件 NoticeView
  • 实习第25天,(8月1日) - Lxx
  • 集训内容总结 day4:组合计数
  • Anaconda安装Python
  • 集训内容总结 day3:字符串
  • 【NX/UG】调出鼠标十字光标
  • 第24天,(7月31日) - Lxx
  • 【BPM+AI】AI助手小歌再进化,智能业务场景震撼登场!
  • 异常
  • 集训内容总结 day2:数据结构
  • Service Fabric Explorer (SFX) v1 Web 客户端潜在风险认知与指导
  • ABB焊接机器人弧焊电源气体节约
  • cpu 使用率是怎么回事呢?
  • 【IEEE独立出版、中国科大主办】2025第五届人工智能、自动化与高性能计算国际会议 (AIAHPC 2025)
  • PDF转Word程序开发思路
  • 080401_halcon官方例程的复现之图像二值化与区域分割
  • 探索旧版Windows系统中处理器信息的查看方法及案例分析
  • 8 月 4 日模拟赛总结 - sb
  • 函数性质的综合应用习题2-02
  • rfl:从 lean 开始的异世界生活(2)——安装 lean copilot
  • STM32CubeIDE新建项目过程记录备忘(五)中断方式的USART串口通信 - 教程
  • win10/win11家庭版本升级专业版本,一键转换升级,安全可靠永久免费非常给力