USACO Section 1.4
Arithmetric Progression
/*
ID: beihai2013
TASK: ariprog
LANG: C++
*/
/*
找出满足(a+i*b)(i<n,i>=0)的所有a,b,其中a+i*b的值在集合S{P^2 + Q^2}中
暴力循环做就可以了,主要是题意比较难理解
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 250 + 3;
int n, m;
int a[MAXN * MAXN], cnt;
bool v[MAXN * MAXN * 2];
bool check(int a, int b)
{
for(int i = 0 ; i < n ; i++) {
// if(a == 2 && b == 24) printf("i = %d, res = %d\n", i, a + b * i);
if(v[a + i * b] == 0) return false;
}
return true;
}
int main()
{
freopen("ariprog.in", "r", stdin);
freopen("ariprog.out", "w", stdout);
while(scanf("%d%d", &n, &m) != EOF) {
cnt = 0;
memset(v, false, sizeof v);
for(int i = 0 ; i <= m ; i++) {
for(int j = i ; j <= m ; j++)
a[cnt++] = i * i + j * j, v[a[cnt - 1]] = 1;
}
sort(a, a + cnt);
int num = 1;
for(int i = 1 ; i < cnt ; i++) {
if(a[i] != a[i - 1]) a[num++] = a[i];
}
cnt = num;
// for(int i = 0 ; i < cnt ; i++) printf("%d ", a[i]);
// printf("\n");
int ok = 0;
for(int len = 1 ; len <= a[cnt - 1] / (n - 1) ; len++) {
for(int i = 0 ; a[i] + (n - 1) * len <= a[cnt - 1] ; i++) {
if(check(a[i], len)) printf("%d %d\n", a[i], len), ok = 1;
}
}
if(ok == 0) puts("NONE");
}
return 0;
}
Mother’s Milk
/*
ID: beihai2013
TASK: milk3
LANG: C++
*/
/*
简单的深搜加一个判重
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 20 + 5;
int vis[MAXN][MAXN][MAXN];
int up[3];
void dfs(int a[3])
{
if(vis[a[0]][a[1]][a[2]]) return;
vis[a[0]][a[1]][a[2]] = 1;
for(int i = 0 ; i < 3 ; i++) {
for(int j = 0 ; j < 3 ; j++) {
if(i == j) continue;
int temp = min(a[i], up[j] - a[j]);
a[i] -= temp, a[j] += temp;
dfs(a);
a[i] += temp, a[j] -= temp;
}
}
}
int main()
{
freopen("milk3.in", "r", stdin);
freopen("milk3.out", "w", stdout);
while(scanf("%d%d%d", &up[0], &up[1], &up[2]) != EOF) {
memset(vis, 0, sizeof vis);
int a[3];
a[0] = 0, a[1] = 0, a[2] = up[2];
dfs(a);
int f = 1;
for(int i = 0 ; i <= up[2] ; i++) {
if(vis[0][up[2] - i][i] == 0) continue;
if(f) f = 0;
else printf(" ");
printf("%d", i);
}
printf("\n");
}
return 0;
}