zoukankan      html  css  js  c++  java
  • ACM学习历程—HDU 5512 Pagodas(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512

    学习菊苣的博客,只粘链接,不粘题目描述了。

    题目大意就是给了初始的集合{a, b},然后取集合里的两个元素进行加或者减的操作,生成新的元素。问最后最多能生成多少个元素。问答案的奇偶性。

    首先一开始有a, b。那么如果生成了b-a(b>a),自然原来的数同样可以由b-a, a生成(b != 2a)

    于是如此反复下去,最后的数必然是可以由两个数p, 2p生成的。

    于是所有的数肯定可以表示成xp+y*2p = (x+2y)p (x >= 0 && y >= 0)

    很显然,最后集合里面所有的数都是p的倍数。而且p的所有小于等于n的倍数构成的集合就是原题中的集合。

    于是只需要判断n/p的奇偶性。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <vector>
    #define LL long long
    
    using namespace std;
    
    int n, a, b;
    
    void turn(int &a, int &b)
    {
        while (b)
        {
            if (a > b) swap(a, b);
            b = b%a;
        }
    }
    
    int main()
    {
        //freopen("test.in", "r", stdin);
        int T;
        scanf("%d", &T);
        for (int times = 0; times < T; ++times)
        {
            scanf("%d%d%d", &n, &a, &b);
            turn(a, b);
            printf("Case #%d: ", times+1);
            if (n/a%2) printf("Yuwgna
    ");
            else printf("Iaka
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    flex-direction
    flex-grow
    Push API
    ServiceWorker.state
    Using Service Workers
    Promise.then
    Promise()
    Using promises
    node-rsa
    async.waterfall
  • 原文地址:https://www.cnblogs.com/andyqsmart/p/4946029.html
Copyright © 2011-2022 走看看