Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define min(a, b) ((a) < (b) ? (a) : (b))
- #define REP(i, n) for ((i) = 0; i < (n); ++i)
- #define MAX 50000
- #define LIMIT 7000
- bool isP[MAX];
- int primes[LIMIT], a, b, k;
- void sieve() {
- int i, k = 0, j;
- isP[0] = isP[1] = 1;
- for (i = 2; i * i < MAX; ++i) {
- if (!isP[i]) {
- for (j = i * i; j < MAX; j += i) {
- isP[j] = 1;
- }
- }
- }
- REP (i, MAX) {
- if (!isP[i] && k < LIMIT) {
- primes[k++] = i;
- }
- }
- }
- bool isPrime(int n) {
- if (MAX > n) {
- return !isP[n];
- } else {
- int i;
- for (i = 0; i < LIMIT && primes[i] != 0; ++i) {
- if (n % primes[i] == 0) {
- return 0;
- }
- }
- return 1;
- }
- }
- int f(int n, int i) {
- if (n < 1) {
- return 0;
- }
- int j;
- int res = n;
- for (j = i; primes[j] < k && primes[j] <= n; ++j) {
- res -= f(n / primes[j], j + 1);
- }
- return res;
- }
- int main() {
- sieve();
- scanf("%d %d %d", &a, &b, &k);
- if (!isPrime(k)) {
- puts("0");
- } else {
- printf("%d\n", f(b / k, 0) - f((a - 1) / k, 0));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement