Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- int computeSum(int index, int depth, int nPrimes, int *primes, int *primeCounts) {
- if (depth == 0)
- return 1;
- int sum = 0;
- int newPrimeCounts[10000];
- memcpy(newPrimeCounts, primeCounts, sizeof(newPrimeCounts));
- for (int i = index; i < nPrimes; i++) {
- if (newPrimeCounts[i] > 0) {
- newPrimeCounts[i]--;
- sum += primes[i] * computeSum(i, depth-1, nPrimes, primes, newPrimeCounts);
- newPrimeCounts[i]++;
- }
- }
- return sum;
- }
- int main() {
- long n, m;
- int k;
- std::cin >> n >> m >> k;
- int nPrimes = 0, primes[10000];
- int sqrt = 1, sqrtCounter = 3, nextSqrtCounter = 5;
- for (int potential = 2; potential <= n; potential++) {
- if (--sqrtCounter == 0) {
- sqrt++;
- sqrtCounter = nextSqrtCounter;
- nextSqrtCounter += 2;
- }
- for (int i = 0; i < nPrimes && primes[i] <= sqrt; i++)
- if (potential % primes[i] == 0)
- goto continueOuterLoop;
- primes[nPrimes++] = potential;
- continueOuterLoop:;
- }
- //for (int i = 0; i < nPrimes; i++)
- // std::cout << primes[i] << std::endl;
- int primeCounts[10000];
- memset(primeCounts, 0, sizeof(primeCounts));
- //std::cout << "=====" << std::endl;
- sqrt = 1; sqrtCounter = 3; nextSqrtCounter = 5;
- for (int num = 2; num <= n; num++) {
- if (--sqrtCounter == 0) {
- sqrt++;
- sqrtCounter = nextSqrtCounter;
- nextSqrtCounter += 2;
- }
- if (num > m || num <= n - m) {
- int num2 = num;
- for (int i = 0; num2 > 1 && i < nPrimes; i++) {
- while (num2 % primes[i] == 0) {
- num2 /= primes[i];
- primeCounts[i] += num <= m ? -1 : 1;
- }
- }
- }
- }
- //std::cout << "=====" << std::endl;
- //for (int i = 0; i < nPrimes; i++)
- // std::cout << primeCounts[i] << std::endl;
- //std::cout << "=====" << std::endl;
- for (int i = 1; i <= k; i++)
- std::cout << computeSum(0, i, nPrimes, primes, primeCounts) << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement