2019年华南理工大学程序设计竞赛 H Parco_Love_GCD(区间gcd_裸)

本文主要解析2019年华南理工大学程序设计竞赛中H题——Parco_Love_GCD问题,涉及区间最大公约数(GCD)的裸题解法。通过链接可以访问到官方题目详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

url:https://ac.nowcoder.com/acm/contest/625/H

 

1.1

2.2 1.2

3.3 2.3 1.3

4.4 3.4 2.3 1.3 

.......

 

 

	#include<bits/stdc++.h>
	using namespace std;
	typedef long long ll;
	#define maxn 500005
	const int mod = 1000000007;
	typedef pair<int,int>P;
	vector<P>vv[maxn];
	ll n,nn,a[maxn];
	ll l,r;
	ll res;
	
	ll gcd(ll a,ll b)
	{
	    return b?gcd(b,a%b):a;
	}
	void update(ll v)
	{
	    ll last=r;
	    ll tmp=0;
	    for(ll i=0;i<vv[r].size();i++)
	    {
	        ll g=vv[r][i].first,p=vv[r][i].second;
	        tmp+=1ll*(last-p+1)*g,last=p-1;
	//        cout<<tmp<<endl;
	    }
	//    cout<<endl;
	    res = (res%mod + 1ll*v*tmp%mod)%mod;
	}
	int main()
	{
	    scanf("%lld",&n);
	    nn=(int)(sqrt(1.0*n)+0.5);
	    for(ll i=1;i<=n;i++)
	    {
	        scanf("%lld",&a[i]);
	        vv[i].clear();
	    }
	    vv[0].clear();
	    for(ll i=1;i<=n;i++)
	    {
	        ll x=a[i],y=i;
	        for(ll j=0;j<vv[i-1].size();j++)
	        {
	            ll g=gcd(vv[i-1][j].first,a[i]);
	            if(g!=x)
	            {
	                vv[i].push_back(P(x,y));
	//                cout<<x<<" "<<y<<endl;
	                x=g;
	            }
	            y=vv[i-1][j].second;
	        }
	        vv[i].push_back(P(x,y));
	//        cout<<x<<" "<<y<<endl;
	//        cout<<endl;
	    }
	    res=0;
	    while(r<=n)
	    {
	        r++,update(1);
	    }
	    printf("%lld\n",res);
	    return 0;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值