每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Codeforces Round #846 (Div. 2)(B,E)

Codeforces Round #846 (Div. 2)(B,E)

B

B

题目大意是给一个长度为n的数组,我们可以把这个数组分成k段(k>1),我们有一个值是每一段的和的gcd

gcd(sum[1],sum[2]+...+sum[k]),我们需要的是这个值的最大是多少

对于分成k段,假设此时的gcdx

如果k=4,那么sum[1]=xcnt1,sum[2]=xcnt2,sum[3]=xcnt3,sum[4]=xcnt4,那么我们可以知道,这四个和都是x的倍数,并且要想x变得更大,那么我们考虑把后面的几个数合并,和还是x的倍数

对于gcd,我们知道对于这些个不同的数(均是x的倍数)把某些数合并,才有可能可以让这些数的gcd变大

gcd=__gcd(sum[1],sum[2]+sum[3]+sum[4])

gcd=__gcd(sum[1]+sum[2],sum[3]+sum[4])

所以,我们可以想到,不管怎么分,只有分成两份的时候才有可能是那个最大的值

具体代码如下

#include <iostream>
#include <algorithm>
using namespace std;
#define int long long 
const int maxn=2e5+10;
#define int long long 
int a[maxn],sum[maxn];
int n,t;
void solve()
{
    cin>>n;
    sum[0]=0;
    int ans=0;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
        if (i==1) ans=a[i];
        else 
        {
            ans=__gcd(ans,a[i]);
        }
    }
    for (int i=1;i<n;i++)
    {
        ans=max(ans,__gcd(sum[i],sum[n]-sum[i]));
    }
    cout<<ans<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

D

交互题,不会

E

E

这个题通过分析后可以这么理解

输出一个LR,我们需要知道这一段之间的数的gcd有多少个不同的数

对于1x,我们可以通过

a=L,b=2L,gcd(a,b)=L

a=L+1,b=2(L+1),gcd(a,b)=L+1

a=L+2,b=2(L+2),gcd(a,b)=L+2

......

a=L+x,b=2(L+x),gcd(a,b)=L+x,b=R

那么对于gcd>=L的数有多少个呢

我们可以看到,有x+1个,cnt=x+1=R2L+1

那么对于gcd<L的,我们可以构造一个d,其中一个数是dLd,另外一个数是d(Ld+1)

对于这个Ld,我们可以发现可以有很多个dLd都是一样的值,对于这些数,我们有一个范围,[l,r]都是一个值

Ll,所以,看到这儿是不是会想到整除分块了

什么是整除分块?

整除分块

通过这个我们有得到以下公式

(1){k=Li=L+i1i=L1i+1r=min(RK+1,max(i)),rkL1

那么我们可以变化一下

(1){k=L1ir=min(RK+2,max(i)),rkL1

但是r的范围还要让r(k+1)<=r,得到r=min(r,RK+2)

#include <iostream>
#include <algorithm>
using namespace std;
#define int long long 
int L,R;
int t;
void solve()
{
    cin>>L>>R;
    int ans=max(0ll,R/2-L+1ll);
    int l=1,r=0;
    for (;l<L;l=r+1)
    {
        int k=(L-1)/l;
        r=(L-1)/k;
        int rr=min(r,R/(k+2));
        ans+=max(0ll,rr-l+1);
    }
    cout<<ans<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}
posted @   righting  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示