HDU 1286:
素数筛+欧拉函数版本:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 33000;
bool vis[33333];
int p[33333];
void prime(int n) {
memset(vis, false, sizeof(vis));
memset(p, 0, sizeof(p));
int pos = 0;
for(int i = 2; i <= n; ++i) {
if(!vis[i]) p[pos++] = i;
for(int j = 0; j < pos && i * p[j] <= n; ++j) {
vis[p[j] * i] = true;
if(i % p[j] == 0) break;
}
}
}
int Euler(int n) {
int ans = n;
for(int i = 0; p[i] * p[i] <= n; ++i) {
if(n % p[i] == 0) {
ans = ans - ans / p[i];
while(n % p[i] == 0) n /= p[i];
}
}
if(n > 1) {
ans = ans - ans / n;
}
return ans;
}
int main() {
int T;
prime(33333);
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
printf("%d\n", Euler(n));
}
return 0;
}
HDU 2588:
#include <bits/stdc++.h>
// X must be a factor of N
using namespace std;
int Euler(int n) {
int ans = n;
for(int i = 2; i * i <= n; ++i) {
if(n % i == 0) {
ans = ans - ans / i;
while(n % i == 0) {
n /= i;
}
}
}
if(n > 1) ans = ans - ans / n;
return ans;
}
int main() {
int T;
scanf("%d ", &T);
while(T--) {
int n, m;
scanf("%d %d", &n, &m);
int sum = 0;
for(int i = 1; i * i <= n; ++i) {
if(n % i == 0) {
if(i >= m) sum += Euler(n / i);
if((n / i) != i && (n / i) >= m) sum += Euler(i); // Whether N is a square number
}
}
printf("%d\n", sum);
}
return 0;
}
HDU 2824:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3333333;
int phi[MAXN];
void Euler() {
for(int i = 1; i <= 3300000; ++i) phi[i] = i;
for(int i = 2; i <= 3300000; i += 2) phi[i] /= 2;
for(int i = 3; i <= 3300000; i += 2) {
if(phi[i] == i) {
for(int j = i; j <= 3300000; j += i) {
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
int main() {
Euler();
int a, b;
while(scanf("%d %d", &a, &b) != EOF) {
long long sum = 0;
for(int i = a; i <= b; ++i) {
sum += phi[i];
}
printf("%lld\n", sum);
}
return 0;
}
HDU 4983:
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
long long Euler(long long n) {
long long ans = n;
for(long long i = 2; i * i <= n; ++i) {
if(n % i == 0) {
ans = ans - ans / i;
while(n % i == 0) {
n /= i;
}
}
}
if(n > 1) ans = ans - ans / n;
return ans;
}
int main() {
long long n, k;
while(scanf("%lld %lld", &n, &k) != EOF) {
if(k == 2 || n == 1) {
puts("1");
} else if(k > 2) {
puts("0");
} else {
long long ans = 0;
for(long long i = 1; i * i <= n; ++i) {
if(n % i == 0) {
if(i * i == n) {
ans += Euler(n / i) * Euler(i);
} else {
ans += 2 * Euler(n / i) * Euler(i);
}
ans %= MOD;
}
}
printf("%lld\n", ans);
}
}
return 0;
}