公式
就是说:
这个数与
以内每个数互质的个数是
以内含有
的因子的数容斥来的,而这个容斥系数就是莫比乌斯函数
就是说与
互质的数等于:含有因子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);
}
}