Advertisement
Earthcomputer

main.cpp

Apr 2nd, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. int computeSum(int index, int depth, int nPrimes, int *primes, int *primeCounts) {
  5.     if (depth == 0)
  6.         return 1;
  7.  
  8.     int sum = 0;
  9.     int newPrimeCounts[10000];
  10.     memcpy(newPrimeCounts, primeCounts, sizeof(newPrimeCounts));
  11.  
  12.     for (int i = index; i < nPrimes; i++) {
  13.         if (newPrimeCounts[i] > 0) {
  14.             newPrimeCounts[i]--;
  15.             sum += primes[i] * computeSum(i, depth-1, nPrimes, primes, newPrimeCounts);
  16.             newPrimeCounts[i]++;
  17.         }
  18.     }
  19.  
  20.     return sum;
  21. }
  22.  
  23. int main() {
  24.     long n, m;
  25.     int k;
  26.     std::cin >> n >> m >> k;
  27.  
  28.     int nPrimes = 0, primes[10000];
  29.     int sqrt = 1, sqrtCounter = 3, nextSqrtCounter = 5;
  30.     for (int potential = 2; potential <= n; potential++) {
  31.         if (--sqrtCounter == 0) {
  32.             sqrt++;
  33.             sqrtCounter = nextSqrtCounter;
  34.             nextSqrtCounter += 2;
  35.         }
  36.  
  37.         for (int i = 0; i < nPrimes && primes[i] <= sqrt; i++)
  38.             if (potential % primes[i] == 0)
  39.                 goto continueOuterLoop;
  40.         primes[nPrimes++] = potential;
  41.         continueOuterLoop:;
  42.     }
  43.  
  44.     //for (int i = 0; i < nPrimes; i++)
  45.     //    std::cout << primes[i] << std::endl;
  46.  
  47.     int primeCounts[10000];
  48.     memset(primeCounts, 0, sizeof(primeCounts));
  49.  
  50.  
  51.     //std::cout << "=====" << std::endl;
  52.  
  53.     sqrt = 1; sqrtCounter = 3; nextSqrtCounter = 5;
  54.     for (int num = 2; num <= n; num++) {
  55.         if (--sqrtCounter == 0) {
  56.             sqrt++;
  57.             sqrtCounter = nextSqrtCounter;
  58.             nextSqrtCounter += 2;
  59.         }
  60.         if (num > m || num <= n - m) {
  61.             int num2 = num;
  62.             for (int i = 0; num2 > 1 && i < nPrimes; i++) {
  63.                 while (num2 % primes[i] == 0) {
  64.                     num2 /= primes[i];
  65.                     primeCounts[i] += num <= m ? -1 : 1;
  66.                 }
  67.             }
  68.         }
  69.     }
  70.  
  71.  
  72.     //std::cout << "=====" << std::endl;
  73.  
  74.     //for (int i = 0; i < nPrimes; i++)
  75.     //    std::cout << primeCounts[i] << std::endl;
  76.  
  77.     //std::cout << "=====" << std::endl;
  78.  
  79.     for (int i = 1; i <= k; i++)
  80.         std::cout << computeSum(0, i, nPrimes, primes, primeCounts) << std::endl;
  81.  
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement