zoukankan      html  css  js  c++  java
  • 济南学习 Day 5 T1 晚

    取模(mod)

    【题目描述】

    有一个整数a和n个整数b_1, …, b_n。在这些数中选出若干个数并重新排列,得到c_1,…, c_r。我们想保证a mod c_1 mod c_2 mod … mod c_r=0。请你得出最小的r,也就是最少要选择多少个数字。如果无解,请输出-1.

    【输入说明】

    输入文件的第一行有一个正整数T,表示数据组数。

    接下去有T组数据,每组数据的第一行有两个正整数n和a.

    第二行有n个正整数b_1, …, b_n.

    【输出说明】

    一行,输出答案。

    【样例输入】

    2

    2 9

    2 7

    2 9

    6 7

    【样例输出】

    2

    -1

    【数据范围】

    对于40%的数据,n<=8

    对于100%的数据,T<=5,n<=20,1 <=a <=10^6,b_i<=10^6

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define INF 2100000000
     6 using namespace std;
     7 int T,n,a[100000],ans,x;
     8 int cmp(int x,int y)
     9 {
    10     return x>y;
    11 }
    12 void Dfs(int w,int t,int now)// w数组下标 now X现在的值 t 用了数组中的多少个数 
    13 {
    14     if(t>=ans) return;
    15     if(now==0) { ans=t;return; } 
    16     if(w==n+1) return;
    17     Dfs(w+1,t,now);
    18     Dfs(w+1,t+1,now%a[w]);
    19 }
    20 int main()
    21 {
    22     scanf("%d",&T);
    23     while(T--)
    24     {
    25         scanf("%d%d",&n,&x);
    26         memset(a,0,sizeof a );
    27         for(int i=1;i<=n;i++)
    28           scanf("%d",&a[i]);
    29         sort(a+1,a+1+n,cmp);
    30         ans=INF;
    31         Dfs(1,0,x);
    32         if(ans==INF) printf("-1
    ");
    33         else printf("%d
    ",ans);
    34     }
    35     return 0;
    36 }

    思路:对于一个数X对他取模,先模一个小的数再模一个大的数肯定没啥卵用,所以我们要从大到小排序,优先模大的数,恩,就酱紫~~

  • 相关阅读:
    大整数模拟
    MSSQL存储过程中获取记录集并循环操作一例
    about协议的妙用
    C#基础概念二十五问
    很完美的JS判断日期函数
    asp.net C# FileUpload 控件如何判断文件名的后缀
    c++中指针学习的两个绝好例子
    ASP.net性能优化总结
    C++指针
    JS中的undefined,null,"",0和false
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6043537.html
Copyright © 2011-2022 走看看