Ranking (as of 2014-08-04): 384 out of 605
Language: C++
/*
UVa 10637 - Coprimes
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10637_Coprimes.cpp
*/
#include <cstdio>
const int S_max = 100;
bool coprimes[S_max + 1][S_max + 1];
// coprimes[i][j] is true if i and j (i <= j) is co-prime
int gcd(int x, int y)
{
if (x < y)
return gcd(y, x);
else
return y == 0 ? x : gcd(y, x % y);
}
void partition(int S, int t, int ti, int numbers[])
{
if (S) {
for (int i = (!ti || numbers[ti - 1] == 1) ? 1 : numbers[ti - 1] + 1;
i <= S; i++) {
int j;
for (j = 0; j < ti; j++)
if (!coprimes[numbers[j]][i])
break;
if (j == ti) {
numbers[ti] = i;
partition(S - i, t, ti + 1, numbers);
}
}
}
else if (ti == t) {
for (int i = 0; i < t; i++)
printf("%d%c", numbers[i], ((i < t - 1) ? ' ' : '\n'));
}
}
int main()
{
for (int i = 1; i <= S_max; i++)
coprimes[1][i] = true;
for (int i = 2; i < S_max; i++)
for (int j = i + 1; j <= S_max; j++)
coprimes[i][j] = gcd(i, j) == 1;
int N;
scanf("%d", &N);
for (int cn = 1; cn <= N; cn++) {
int S, t;
scanf("%d %d", &S, &t);
printf("Case %d:\n", cn);
int numbers[S_max];
partition(S, t, 0, numbers);
}
return 0;
}
No comments:
Post a Comment