2025多校冲刺省选模拟赛10
2025多校冲刺省选模拟赛10
\(T1\) A. 电车 \(5pts\)
-
直接化简成质因数分解的形式,因质因数分解是唯一的,故可以只考虑下标为质数处的值交换。
-
容易发现 \(2p_{1},2p_{2}>n\) 的质数 \(p_{1},p_{2}\) 交换后不会影响合法性,考虑进一步扩展。
-
对着指数确定范围无法处理,不妨直接看成 \(x \times p>n\) 的形式,此时 \(\left\lfloor \frac{n}{x} \right\rfloor <p \le \left\lfloor \frac{n}{x-1} \right\rfloor\) 。
-
整除分块对 \(\left\lfloor \frac{n}{i} \right\rfloor\) 相等的极长区间处理素数个数即可。
点击查看代码
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; }
\(T2\) B. 波长 \(5pts\)
-
部分分
- \(55pts\) :
- 理论上最大子段内任意选择一个 \(-1\) 均可,不妨直接取端点处 \(-1\) 。
- 子段后面是否有 \(0\) 视写法会影响正确性,一个容易处理的方式是取最靠左的极短最大子段。
点击查看代码
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; }
- \(55pts\) :
-
正解
\(T3\) C. 捕获 \(0pts\)
-
部分分
- 测试点 \(13,14\) :双指针扫左部点(从大到小)和右部点(从小到大),匹配失败就交换左右部分。
点击查看代码
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; }
-
正解
总结
- 整场都在死磕 \(T3\) 的一般图最大权匹配 \(20pts\) 暴力,误认为网络流可做。
- \(T3\) 为了方便,把匹配失败就交换左右部分写成了跑两遍分别匹配,挂了 \(10pts\) 。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18704565,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。