今天開始專研數論。先從最基礎的歐拉函數開始。
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;
}