// UVa 10637 - Coprimes
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int n, m, mask[101], sol[31];
void comb(int i, int j, int l, int current_mask) {
sol[i] = l;
if (i == n) {
if (m == j) {
printf("%d", sol[1]);
for (int k = 2; k <= i; k++)
printf(" %d", sol[k]);
printf("\n");
}
return;
}
for (int k = l; k <= m - j - l * (n - i - 1); k++) {
if ((mask[k] & current_mask) == 0)
comb(i + 1, j + k, k, current_mask | mask[k]);
}
}
int main() {
// sieve
bool is_prime[101];
vector<int> prime;
memset(is_prime, true, sizeof(is_prime));
prime.push_back(2);
for (int j = 4; j <= 100; j += 2)
is_prime[j] = false;
for (int i = 3; i <= 100; i++)
if (is_prime[i]) {
prime.push_back(i);
for (int j = i * i; j <= 100; j += (i << 1))
is_prime[j] = false;
}
// calculate masks
int one = 1;
for (int k = 1; k <= 100; k++) {
mask[k] = 0;
for (int p = 0; p < prime.size(); p++) {
if (k % prime[p] == 0)
mask[k] = mask[k] | (one << p);
}
}
// start
int tt;
scanf("%d", &tt);
for (int t = 1; t <= tt; t++) {
// input
scanf("%d%d", &m, &n);
printf("Case %d:\n", t);
// combine
comb(0, 0, 1, 0);
}
return 0;
}
Friday, August 28, 2015
UVa 10637 - Coprimes
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment