其他分享
首页 > 其他分享> > CCPC2021河北省赛 K.Kate and Company Management(dp、质因数分解)

CCPC2021河北省赛 K.Kate and Company Management(dp、质因数分解)

作者:互联网

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int N = 3e5 + 5;
const int M = 1e5 + 5;
int prime[M], vis[M];
map<int, int> m;
vector<int> fac[N];
int dp[N], a[N];
int n, cnt = 0;
bool cmp(int a, int b)
{
    return a > b;
}
void init() //素数打表
{
    vis[0] = vis[1] = 1;
    for(int i = 2; i <= 1e5; i++)
    {
        if(!vis[i]) prime[++cnt] = i;
        for(int j = 1; j <= cnt && i * prime[j] <= 1e5; j++)
        {
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
        }
    }
}
void getfac() //质因数分解
{
    for(int i = 1; i <= n; i++)
    {
        int val = a[i];
        int num = 1;
        while(val > 1)
        {
            if(!vis[val]) //val为素数
            {
                fac[i].push_back(val);
                val = 1;
                break;
            }
            while(val % prime[num] == 0)
            {
                fac[i].push_back(prime[num]);
                val /= prime[num];
            }
            num ++;
        }
    }
}
int main()
{
    init();
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + 1 + n, cmp);
    getfac();
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < fac[i].size(); j++)
        {
            int x = fac[i][j];
            dp[i] = max(dp[i], m[x] + 1);
        }
        for(int j = 0; j < fac[i].size(); j++)
        {
            int x = fac[i][j];
            m[x] = dp[i];
        }
    }
    int res = -1;
    for(int i = 1; i <= n; i++)
        res = max(res, dp[i]);
    if(res > 3) cout << res << endl;
    else cout << "-1" << endl;
    return 0;
}

标签:CCPC2021,Management,因数分解,val,int,include,序列,质因数,dp
来源: https://www.cnblogs.com/K2MnO4/p/14833103.html