2025多校冲刺省选模拟赛10
2025多校冲刺省选模拟赛10
A. 电车
-
直接化简成质因数分解的形式,因质因数分解是唯一的,故可以只考虑下标为质数处的值交换。
-
容易发现
的质数 交换后不会影响合法性,考虑进一步扩展。 -
对着指数确定范围无法处理,不妨直接看成
的形式,此时 。 -
整除分块对
相等的极长区间处理素数个数即可。点击查看代码
const int p=998244353; int prime[10000010],vis[10000010],sum[10000010],jc[10000010],len; void isprime(int n) { memset(vis,0,sizeof(vis)); for(int i=2;i<=n;i++) { if(vis[i]==0) { len++; prime[len]=i; } for(int j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) break; } } jc[0]=1; for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+(vis[i]==0); jc[i]=1ll*jc[i-1]*i%p; } } int ask(int n) { int ans=1; for(int l=1,r;l<=n;l=r+1) { r=(n/l>=1)?min(n,n/(n/l)):n; ans=1ll*ans*jc[sum[r]-sum[l-1]]%p; } return ans; } int main() { #define Isaac #ifdef Isaac freopen("densha.in","r",stdin); freopen("densha.out","w",stdout); #endif int t,n,i; cin>>t; isprime(10000000); for(i=1;i<=t;i++) { cin>>n; cout<<ask(n)<<endl; } return 0; }
B. 波长
-
部分分
:- 理论上最大子段内任意选择一个
均可,不妨直接取端点处 。 - 子段后面是否有
视写法会影响正确性,一个容易处理的方式是取最靠左的极短最大子段。
- 理论上最大子段内任意选择一个
点击查看代码
const ll p=998244353; ll a[100010]; int main() { #define Isaac #ifdef Isaac freopen("hacho.in","r",stdin); freopen("hacho.out","w",stdout); #endif ll n,k,sum=0,ans=0,maxx=-0x3f3f3f3f3f3f3f3f,pos=0,i,j; cin>>n>>k; for(i=1;i<=n;i++) { cin>>a[i]; sum=max(a[i],sum+a[i]); if(sum>maxx) { maxx=sum; pos=i; } } a[pos]--; for(j=1;j<=k;j++) { maxx=-0x3f3f3f3f3f3f3f3f; sum=pos=0; for(i=1;i<=n;i++) { sum=max(a[i],sum+a[i]); if(sum>maxx) { maxx=sum; pos=i; } } ans=(ans+maxx%p+p)%p; a[pos]--; } cout<<ans<<endl; return 0; }
-
正解
C. 捕获
-
部分分
- 测试点
:双指针扫左部点(从大到小)和右部点(从小到大),匹配失败就交换左右部分。
点击查看代码
ll c[100010],a[100010]; deque<ll>q[100010]; ll solve(deque<ll>&v1,deque<ll>&v2,ll m) { if(v1.size()==0||v2.size()==0) return 0; ll ans=0; while(v1.empty()==0&&v2.empty()==0) { if(v1.size()<v2.size()) swap(v1,v2); if(v1.back()+v2.front()<=m) { ans+=v1.back()+v2.front(); v2.pop_front(); } v1.pop_back(); } return ans; } int main() { #define Isaac #ifdef Isaac freopen("hokaku.in","r",stdin); freopen("hokaku.out","w",stdout); #endif ll t,n,m,i,j; scanf("%lld",&t); for(j=1;j<=t;j++) { scanf("%lld%lld",&n,&m); for(i=1;i<=n;i++) q[i].clear(); for(i=1;i<=n;i++) { scanf("%lld%lld",&c[i],&a[i]); q[c[i]].push_back(a[i]); } for(i=1;i<=n;i++) sort(q[i].begin(),q[i].end()); printf("%lld\n",solve(q[1],q[2],m)); } return 0; }
- 测试点
-
正解
总结
- 整场都在死磕
的一般图最大权匹配 暴力,误认为网络流可做。 为了方便,把匹配失败就交换左右部分写成了跑两遍分别匹配,挂了 。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18704565,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探