Coprime Subsequences

Coprime Subsequences

https://ac.nowcoder.com/acm/problem/112055

题意:
给你一个长度为n的序列,让你求序列的最大公约数为1的子序列数目为多少?

思路:
莫比乌斯反演
首先统计一下该序列有什么数,个数为多少。
然后求莫比乌斯函数。
统计有i为因子的数有x。
根据x求都有该因子的序列有 (图片说明 )个
根据莫比乌斯函数判断该序列数是加上还是减去.
最后得出结果.

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf=1e9+7;
const int N=2e5+5;

ll x,mu[N], ma[N];

ll dp[N], prime[N], ji=0, pa[N];

int main()
{
    int n;
    ll m=0;
    cin>>n;
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        dp[i]=dp[i-1]*2%inf;
    }
    for(int i=1;i<=n;i++)
    {
            cin>>x;
            m=max(m,x);
            ma[x]++;
    }
    mu[1]=1;
    pa[1]=1;
    for(ll i=2;i<=m;i++)
    {
        if(!pa[i])
        {
            prime[ji++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<ji;j++)
        {
            if(i*prime[j]>m)
            {
                break;
            }
            pa[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                mu[i*prime[j]]=0;
                break;
            }
            else
            {
                mu[i*prime[j]]=-mu[i];
            }
        }
    }
    ll ans=0;
    for(int i=1;i<=m;i++)
    {
        ll s=0;
        for(int j=1;j*i<=m;j++)
        {
            s+=ma[i*j];
        }
        ans=(ans+(mu[i]*(dp[s]-1)%inf+inf)%inf)%inf;
    }
    cout<<ans<<'\n';
    return 0;
}
每日一题题解 文章被收录于专栏

写题解

全部评论

相关推荐

06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
认真搞学习:这么良心的老板真少见
点赞 评论 收藏
分享
不亏是提前批,神仙打架,鼠鼠不配了
站队站对牛:现在92都报工艺岗了
投递韶音科技等公司7个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务