码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1681 Frobenius

时间:2016-04-29 11:49:37      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:Frobenius

思路:想了很久还是没转过弯来。

递推。

初始化vis[0] = 1,每次有四种方法扩展,这样能扩展到所有能被表示的数。上界的判定,如果一万以内的数都能被表示,那以后的数肯定就都能被表示。

/*
HDU 1681 递推。if (vis[i] == 1) {vis[i+a] = vis[i+b] = vis[i+c] = vis[i+d] = 1; }
可以得到所有0~10^6以内不能被表示的数。然后,判断最大是不是<10^6,只要循环到一百万零一万就可以了。
因为四个数范围都<=一万。
*/


#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define maxn 2000000

bool vis[maxn];

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        int a, b, c, d;
        memset(vis, 0, sizeof(vis));
        scanf("%d%d%d%d", &a, &b, &c, &d);
        int ans = -1, cnt = 0;
        vis[0] = 1;

        for (int i=0; i<=maxn/2+a+b+c+d; ++i) {
            if (vis[i]) {
                vis[i+a] = vis[i+b] = vis[i+b] = vis[i+c] = vis[i+d] = 1;
            }
            else {
                if (i <= maxn/2) cnt++;
                ans = max(ans, i);
            }
        }

        if (ans > maxn/2) ans = -1;
        printf("%d\n%d\n", cnt, ans);
    }
    return 0;
}

  

HDU 1681 Frobenius

标签:

原文地址:http://www.cnblogs.com/icode-girl/p/5445473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!