2025多校冲刺省选模拟赛10

2025多校冲刺省选模拟赛10

T1 A. 电车 5pts

  • 直接化简成质因数分解的形式,因质因数分解是唯一的,故可以只考虑下标为质数处的值交换。

  • 容易发现 2p1,2p2>n 的质数 p1,p2 交换后不会影响合法性,考虑进一步扩展。

  • 对着指数确定范围无法处理,不妨直接看成 x×p>n 的形式,此时 nx<pnx1

  • 整除分块对 ni 相等的极长区间处理素数个数即可。

    点击查看代码
    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;
    }
    
  • 正解

T3 C. 捕获 0pts

  • 原题: AT_wtf22_day2_c Jewel Pairs

  • 部分分

    • 测试点 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
posted @   hzoi_Shadow  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
扩大
缩小
点击右上角即可分享
微信分享提示