Problem J. Prime Game 2019南京站ICPC

思路:計算第i個數中包含的每個素數對答案的貢獻(其貢獻的區間爲[i,i+1,i+2...n],則貢獻爲n-i+1)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
int n,a[1000010];
vector<int> v[1000010];
 
int main()
{
    for(int i=2;i<1000010;i++)
        v[i].push_back(0);
 
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        int m=a[i];
        for(int j=2;j<=sqrt(m);j++){
            if(m%j==0){
                v[j].push_back(i);
                while(m%j==0)
                    m/=j;
            }
        }
        if(m>1)
            v[m].push_back(i);
    }
 
    ll ans=0;
    for(ll i=2;i<1000010;i++){
        for(ll k=1;k<v[i].size();k++)
            ans+=(ll)(n-v[i][k]+1)*(v[i][k]-v[i][k-1]);
    }
    printf("%lld\n",ans);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章