取模(mod)

取模(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

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 100005
int T,n,a,c[25],ans;
int Dfs(int x,int m,int num)
{
    if(m==0)
    {
        ans=min(ans,num);
        return 0;
    }
    for(int i=x;i>=1;i--)
        if(m>=c[i])
            Dfs(i,m%c[i],num+1);
}
int main()
{  
//    freopen("mod.in","r",stdin);
//    freopen("mod.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        memset(c,0,sizeof(c));
        scanf("%d%d",&n,&a);
        for(int i=1;i<=n;i++) scanf("%d",&c[i]);
        sort(c+1,c+n+1);
        ans=25;
        Dfs(n,a,0);
        if(ans==25) ans=-1;
        printf("%d
",ans);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/xiaoningmeng/p/6038193.html