USACO Section 1.4

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值