• BestCoder#49


    Untitled

    Accepts: 504
    Submissions: 1542
    Time Limit: 2000/1000 MS (Java/Others)
    Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    There is an integer aaa and nnn integers b1,…,bnb_1, ldots, b_nb1​​,,bn​​. After selecting some numbers from b1,…,bnb_1, ldots, b_nb1​​,,bn​​ in any order, say c1,…,crc_1, ldots, c_rc1​​,,cr​​, we want to make sure that a mod c1 mod c2 mod… mod cr=0a mod c_1 mod c_2 mod ldots mod c_r = 0a mod c1​​ mod c2​​ mod mod cr​​=0 (i.e., aaa will become the remainder divided by cic_ici​​ each time, and at the end, we want aaa to become 000). Please determine the minimum value of rrr. If the goal cannot be achieved, print −1-1−1 instead.

    Input

    The first line contains one integer T≤5T leq 5T5, which represents the number of testcases.

    For each testcase, there are two lines:

    1. The first line contains two integers nnn and aaa (1≤n≤20,1≤a≤1061 leq n leq 20, 1 leq a leq 10^61n20,1a106​​).

    2. The second line contains nnn integers b1,…,bnb_1, ldots, b_nb1​​,,bn​​ (∀1≤i≤n,1≤bi≤106forall 1leq i leq n, 1 leq b_i leq 10^61in,1bi​​106​​).

    Output

    Print TTT answers in TTT lines.

    Sample Input
    2
    2 9
    2 7
    2 9
    6 7
    
    Sample Output
    2
    -1

    运用二进制的思想,去枚举每种可能的情况,然后算下最小的。当然,先把比 a 大的数筛掉
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
          int T;
          cin >> T;
          int n, a, b[25], i, cnt;
          while(T--) {
                int Min = 50;
                bool tag = false;
                cin >>n >> a;
                for(int i = 0; i < n; ++i)
                      cin >> b[i];
                sort(b, b+n);
                for(i = n-1; i >= 0; --i) {
                      if(a >= b[i])
                            break;
                }
                if(i == 0) {
                      if(a % b[0] == 0)
                            cout << 1 << endl;
                      else
                            cout << -1 << endl;
                } else {
                      for(int j = 1; j < (1 << (i+1)); ++j) {
                            int tmp = a;
                            cnt = 0;
                            for(int k = i; k >= 0 ; --k) {
                                  if((1 << k) & j) {
                                        tmp %= b[k];
                                        cnt++;
                                        //cout << j << " " <<tmp << " " << b[k] << " "<<cnt << endl;;
                                  }
                            }
                            if(tmp == 0) {
                                  Min = min(Min, cnt);
                                  tag = true;
                            }
                      }
                      if(tag)
                            cout << Min << endl;
                      else
                            cout << -1 << endl;
                }
          }
          return 0;
    }
  • 相关阅读:
    康复计划#4 快速构造支配树的Lengauer-Tarjan算法
    康复计划#3 简单常用的几种计算自然数幂和的方法
    长链剖分随想
    康复计划#2 常用基础数论知识杂烩
    康复计划#1 再探后缀自动机&后缀树
    WC2017游记 & 能力残废康复计划
    Bubble Cup 8 finals I. Robots protection (575I)
    Bubble Cup 8 finals H. Bots (575H)
    Angular懒加载模块使用http拦截失效问题
    Git Commit提交规范
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4695167.html
Copyright © 2020-2023  润新知