Advertisement

2018南京区域赛J-Prime Game【素数分解】

阅读量:

思路:我们需要计算每个质因数的贡献。首先对所有素数进行筛选,在此基础上对每个数字进行质因数分解。从而我们可以获得该数字所包含的素因子。接着我们需要计算每个因子在区间内的贡献程度。具体可以看代码,在此基础之上我们还需要持续更新这些素因子的位置信息。

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 typedef long long ll;
    
 const int maxn = 1e6 + 10;
    
 const int mod = 1e9 + 7;
    
 int prime[maxn], a[maxn];
    
 int pre[maxn];
    
 ll ans = 0;
    
 int n;
    
 void getprime()
    
 {
    
     prime[0] = 0;
    
     for(int i = 2; i < maxn; ++i)
    
     {
    
     if(!a[i])
    
     {
    
         prime[++prime[0]] = i;
    
         for(int j = i * 2; j < maxn; j += i)
    
             a[j] = 1;
    
     }
    
     }
    
 }
    
 void slove(int x, int idx)
    
 {
    
     for(int i = 1; i < prime[0] && prime[i] * prime[i] <= x; ++i)
    
     {
    
     if(x % prime[i] == 0)
    
     {
    
         int pos = pre[prime[i]];
    
         int l = idx - pos;
    
         int r = n - idx + 1;
    
         ans += (ll)l * r;
    
         pre[prime[i]] = idx;
    
         while(x % prime[i] == 0)
    
             x /= prime[i];
    
     }
    
     }
    
     if(x > 1)
    
     {
    
     int pos = pre[x];
    
     int l = idx - pos;
    
     int r = n - idx + 1;
    
     ans += (ll)l * r;
    
     pre[x] = idx;
    
     }
    
 }
    
  
    
 int main()
    
 {
    
     getprime();
    
     memset(pre, 0, sizeof(pre));
    
     scanf("%d", &n);
    
     for(int i = 1; i <= n; ++i)
    
     scanf("%d", &a[i]);
    
     for(int i = 1; i <= n; ++i)
    
     {
    
     slove(a[i], i);
    
     }
    
     cout << ans << endl;
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~