2018 ACM-ICPC 南京站 J Prime Game 素數篩

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int f[maxn],prime[maxn],cnt,a[maxn],n;
vector<int> pre[maxn];
vector<int> pos[maxn];
void init()
{
    for(int i=2;i<maxn;i++)
    {
        if(!f[i])
        {
            prime[cnt++]=i;
            pre[i].push_back(i);
        }
        for(int j=0;j<cnt;j++)
        {
            if(i*prime[j]>=maxn)
                break;
            f[i*prime[j]]=1;
            pre[i*prime[j]]=pre[i];
            if(i%prime[j]==0)
                break;
            else
                pre[i*prime[j]].push_back(prime[j]);
        }
    }
}
int main()
{
    init();
    ll ans=0;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;++i)
        {
            scanf("%d",a+i);
            for(int j=pre[a[i]].size()-1;j>=0;--j)
                pos[pre[a[i]][j]].push_back(i);
        }
        ans=0;
        for(int i=0;i<cnt;i++)
        {
            if(pos[prime[i]].size()==0)
                continue;
            ll now=0,tp=0;
            for(int j=0;j<pos[prime[i]].size();j++)
            {
                tp+=(pos[prime[i]][j]-now)*(pos[prime[i]][j]-now-1)/2;
                now=(ll)pos[prime[i]][j];
            }
            tp+=(n+1-now)*(n-now)/2;
            ans+=(ll)n*(n+1)/2-tp;
        }
        printf("%lld\n",ans);
        for(int i=0;i<maxn;i++)
            pos[i].clear();
    }
    return 0;
}
/*
10
99 62 10 47 53 9 83 33 15 24
10
6 7 5 5 4 9 9 1 8 12
*/

 

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