求n以内每个数与其他数互质的个数

公式

i = 1 n [ g c d ( i , m ) == 1 ] = d | m μ ( d ) n d

就是说: m 这个数与 n 以内每个数互质的个数是 n 以内含有 m 的因子的数容斥来的,而这个容斥系数就是莫比乌斯函数
就是说与 m 互质的数等于:含有因子1 的 含有因子2的 含有因子3的+含有因子6的+含有因子10的+….

而我们要求的是[1,n]所以的数与其他数互质的个数,所以不能一个一个的求,要考虑每个因子对其他数的贡献,有种筛的感觉

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
int a[maxn];
int cnt1[maxn];//cnt1[i]±íʾiÕâ¸öÊýÓжàÉÙ¸ö
int cnt2[maxn];//cnt2[i]±íʾiµÄ±¶ÊýÓжàÉÙ¸ö,Ò²À«ÒÔÀí½â³ÉÒÔiΪÒò×ÓµÄÊýµÄ¸öÊý 
int cnt3[maxn];//c[i]±íʾnÒÔÄÚÓëi»¥ÖʵÄÊý 
bool vis[maxn];
vector<LL>prime;
int mu[maxn];
LL N;
void PHI(int n)
{
    memset(vis,1,sizeof(vis));
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(vis[i])
        {
            prime.push_back(i);
            mu[i]=-1;
        }
        for(int j=0;j<prime.size()&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=0;
            if(i%prime[j]==0)
            {
                mu[i*prime[j]]=0;
                break;
            }
            else mu[i*prime[j]]=-mu[i];
        }
    }
}
void solve(LL n)
{

    for(LL i=1;i<=n;i++)
    { 
        for(LL j=i;j<=n;j+=i)cnt2[i]+=cnt1[i];//Çó³öiµÄ±¶ÊýÓжàÉÙ¸ö£¬±£´æÔÚbÖÐ 
        for(LL j=i;j<=n;j+=i)cnt3[j]+=mu[i]*cnt2[i];//ö¾Ùº¬ÓÐiÕâ¸öÒò×ÓµÄÊýj£¬°ÑiÕâ¸öÒò×ӵűÏ׶¼·¢³öÈ¥£¬¸ù¾ÝmuÀ´¾ö¶¨ÊǼӻ¹ÊǼõ 
    }
    for(int i=1;i<=n;i++)cout<<"i="<<i<<" "<<cnt2[i]<<" "<<cnt3[i]<<endl;
}
int main()
{
    PHI(maxn-5);
    int N;
    while(cin>>N)
    {
        memset(cnt1,0,sizeof cnt1);
        memset(cnt2,0,sizeof cnt2);
        memset(cnt3,0,sizeof cnt3);
        for(int i=1;i<=N;i++)cnt1[i]++;
        solve(N);
    }
}

猜你喜欢

转载自blog.csdn.net/SwustLpf/article/details/82698185
今日推荐