百萬小小兵

【簡要題意】求1-n中與n不互質的數的個數。 n<=1e8

【分析】
當然是求φ(n)\varphi(n)然後相減啦。。。。利用公式
φ(n)=n(11p1)(11p2)(11p3)\varphi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3})······

然後通過計算得知n至多有9個不同的質因數,所以也可以直接容斥原理。

【code】
只有容斥的部分

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans;
int p[50],cnt=0;
void dfs(int u,int chs,int num){
	if(u>cnt){
		if(!chs) return ;
		if(chs&1)ans+=n/num;
		else ans-=n/num;
		return ;
	}
	dfs(u+1,chs+1,num*p[u]);
	dfs(u+1,chs,num);
}
int main(){
	freopen("million.in","r",stdin);
	freopen("million.out","w",stdout);
	cin>>n;int x=n;
	for(int i=2;i*i<=x;i++){
		if(x%i==0){
			p[++cnt]=i;
			while(x%i==0) x/=i;
		}
	}
	if(x>1) p[++cnt]=x;
	dfs(1,0,1);
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章