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 Isaacfreopen("densha.in","r",stdin);freopen("densha.out","w",stdout); #endifint 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 Isaacfreopen("hacho.in","r",stdin);freopen("hacho.out","w",stdout); #endifll 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 Isaacfreopen("hokaku.in","r",stdin);freopen("hokaku.out","w",stdout); #endifll 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\) 。