码迷,mamicode.com
首页 > 其他好文 > 详细

J - Prime Game(数论分解质因子)

时间:2020-11-26 14:12:51      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:bsp   产生   长度   mes   cout   位置   span   ack   这一   

题意就是算子区间内的不同质因子的个数

题目大意:有一个长度为n的序列a,定义mul(l, r)为区间[l, r]中a[i]的乘积,

fac(l, r)为mul(l, r)不同素数因子的个数。求所有区间fac的和。

和这个题有点类似

给定一个长度为n的序列,然后求出每一个子区间不同数的个数和。而这一道题就是组合计数,计算每一个位置上的值对最后区间计数所产生的贡献。

而这道题类似,略微修改即是每一个位置上不只一个值(分解可能得到多个质因子),所以就用vector来存放。

所以他的贡献就是

技术图片

 

 

 

技术图片

 

 

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
vector<int>v[maxn];
int prime[maxn];
bool biaoji[maxn];
int a[maxn]; 
int cnt=0;
void get(){
    for(int i=2;i<maxn;i++){
        if(!biaoji[i]) prime[++cnt]=i;
        for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
            biaoji[i*prime[j]]=1;
            if(i%prime[j]==0){
                break;
            }
        }
    } 
}
void di(int x){
    int t=a[x];
    for(int j=1;j<=cnt&&prime[j]*prime[j]<=t;j++){
        if(t%prime[j]==0){
            v[prime[j]].push_back(x);
            while(t%prime[j]==0){
                t/=prime[j];
            }
        }
    }
    if(t!=1){
        v[t].push_back(x);
    } 
} 
int main(){
    get();
    int n;
    cin>>n;
    for(int i=2;i<=maxn;i++){
        v[i].push_back(0);
    }
    for(int i=1;i<=n;i++){
        cin>>a[i];
        di(i);
    } 
    ll ans=0;
    for(int i=1;i<=cnt;i++){
        for(int j=1;j<v[prime[i]].size();j++){
            ans=ans+1ll*(v[prime[i]][j]-v[prime[i]][j-1])*1ll*(n-v[prime[i]][j]+1); 
        } 
    }
    cout<<ans<<endl;
} 

 

J - Prime Game(数论分解质因子)

标签:bsp   产生   长度   mes   cout   位置   span   ack   这一   

原文地址:https://www.cnblogs.com/lipu123/p/14019088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!