zoukankan      html  css  js  c++  java
  • AtCoder-3856

    An adult game master and N children are playing a game on an ice rink. The game consists of K rounds. In the i-th round, the game master announces:

    • Form groups consisting of Ai children each!

    Then the children who are still in the game form as many groups of Ai children as possible. One child may belong to at most one group. Those who are left without a group leave the game. The others proceed to the next round. Note that it's possible that nobody leaves the game in some round.

    In the end, after the K-th round, there are exactly two children left, and they are declared the winners.

    You have heard the values of A1A2, ..., AK. You don't know N, but you want to estimate it.

    Find the smallest and the largest possible number of children in the game before the start, or determine that no valid values of N exist.

    Constraints

    • 1K105
    • 2Ai109
    • All input values are integers.
    Input

    Input is given from Standard Input in the following format:

    K
    A1 A2  AK
    
    Output

    Print two integers representing the smallest and the largest possible value of N, respectively, or a single integer −1 if the described situation is impossible.

    Sample Input 1

    4
    3 4 3 2
    
    Sample Output 1

    6 8
    

    For example, if the game starts with 6 children, then it proceeds as follows:

    • In the first round, 6 children form 2 groups of 3 children, and nobody leaves the game.
    • In the second round, 6 children form 1 group of 4 children, and 2 children leave the game.
    • In the third round, 4 children form 1 group of 3 children, and 1 child leaves the game.
    • In the fourth round, 3 children form 1 group of 2 children, and 1 child leaves the game.

    The last 2 children are declared the winners.

    Sample Input 2

    5
    3 4 100 3 2
    
    Sample Output 2

    -1
    

    This situation is impossible. In particular, if the game starts with less than 100children, everyone leaves after the third round.

    Sample Input 3

    10
    2 2 2 2 2 2 2 2 2 2
    
    Sample Output 3

    2 3

    题解:这道题应该倒过来反推;代码如下:


    AC代码为:

    #include <iostream>  
    #include <cstdio>  
    using namespace std;


    int a[100005];
    int main() 
    {
    int k;
    cin >> k;
    for (int i = 1; i <= k; i++) 
    {
    cin >> a[i];
    }
    long long mmax = 2, mmin = 2;
    for (int i = k; i >= 1 && mmax >= mmin; i--)
    {
    if (mmin%a[i] != 0)
    mmin = mmin / a[i] * a[i] + a[i];
    mmax = (mmax / a[i] + 1)*a[i] - 1;
    }
    if (mmax >= mmin)
    cout << mmin << ' ' << mmax << endl;
    else
    cout << -1 << endl;

    return 0;
    }














  • 相关阅读:
    开始我的博客
    POJ 1284:Primitive Roots(素数原根的个数)
    数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
    NYOJ 85:有趣的数(打表,规律)
    NYOJ 12:喷水装置(二)(贪心,区间覆盖问题)
    HDU 2058:The sum problem(数学)
    HDU 1716:排列2(全排列)
    HDU 2048:神、上帝以及老天爷(错排公式,递推)
    NYOJ 6:喷水装置(一)(贪心)
    BZOJ 2002:Bounce 弹飞绵羊(分块)
  • 原文地址:https://www.cnblogs.com/csushl/p/9386611.html
Copyright © 2011-2022 走看看