歐拉函數 vj某水題集

今天開始專研數論。先從最基礎的歐拉函數開始。

https://vjudge.net/contest/211370#overview

A

歐拉函數水題

#include<iostream>
#include<algorithm>
using namespace std;


int euler(int n){
	int res = n,a = n;
	for(int i = 2;i*i <= n;++i){
		if(a % i == 0){
			a /= i;
			res = res/i*(i-1);
			while(a%i == 0) a /= i;
		}
	}
	if(a > 1) res = res/a*(a-1);
	return res;
}

int main(){
	int n,num;
	cin>>n;
	while(n--){
		cin>>num;
		cout<<euler(num)<<endl;
	}
	return 0;
}

B

一個數減去它的歐拉函數再減去它自身

#include<iostream>
#include<algorithm>
using namespace std;


int euler(int n){
	int res = n,a = n;
	for(int i = 2;i*i <= n;++i){
		if(a % i == 0){
			a /= i;
			res = res/i*(i-1);
			while(a%i == 0) a /= i;
		}
	}
	if(a > 1) res = res/a*(a-1);
	return res;
}

int main(){
	int n;
	while(cin>>n&&n){
		cout<<n-euler(n)-1<<endl;
	}
	return 0;
}

c 求1...n-1與n不互質的的和

#include<iostream>
#include<algorithm>
 
using namespace std;
 
long long euler(long long n){
    long long i, ans = n;
    for(i = 2; i*i <= n; i++){
        if(n%i == 0){
        n/=i;
        ans -= ans/i;
        while(n%i == 0){
            n/=i; 
        }
    }
    }    
    if(n > 1) ans -= ans/n;
    return ans;
}

int main(){
	long long n,ans;
	while(cin>>n&&n){
		ans = n*(n-1)/2;
		cout<<(ans-(n*euler(n)/2))%1000000007<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章