zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    华为网络层协议介绍
    华为交换机基本原理
    对网络布线与数制转换粗浅认识
    对 计算机网络参考模型新认识
    我对5G的初步认识
    三层交换机单臂路由
    同网段中不同vlan间,客户机从服务器中下载数据
    Telnet远程配置
    华为模拟器里使用RIP协议跨越主类网络边界的实验现象
    7.10 IP地址的格式 以及 网段地址等
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4695167.html
Copyright © 2011-2022 走看看