1 条题解

  • 0
    @ 2024-4-8 17:16:42
    //计算每个ai对答案的贡献
    //f[i]=max(a[i],a[2i],...,a[ki])
    //那么对f排序,原问题中比f[i]小的数的个数,都可以选或者不选
    //f排序后,ans+=f[i]*2^(i-1) 
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10,mod=998244353;
    int n,a[N],f[N];
    ll ans;
    ll pw(ll a,ll b)
    {
    	ll ret=1;
    	while(b)
    	{
    		if(b&1)ret=ret*a%mod;
    		a=a*a%mod;
    		b=b>>1;
    	}
    	return ret;
    }
    
    int main()
    {
    	ios::sync_with_stdio(0);cin.tie(0);
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	
    	for(int i=1;i<=n;i++)  //时间复杂度为 nlog(n) 
    	{
    		f[i]=a[i];
    		for(int j=i;j<=n;j+=i)
    			if(a[j]>f[i])f[i]=a[j];
    	}
    	//对f[i] 排序
    	
    	sort(f+1,f+n+1);
    	for(int i=1;i<=n;i++)
    		ans=(ans+f[i]*pw(2,i-1))%mod;
    	cout<<ans;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    8736
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者