hdu 1755 数学 ***

链接:点我

题解可以看这里:点我这里

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 #define N 50005

 5 #define LL __int64

 6 

 7 using namespace std;

 8 

 9 LL st[N],total,h[15],n,flag[15];

10 LL Dp[105][105],m;

11 

12 void Dfs(int x,LL num)//递归求所有的组合

13 {

14     if(x>=n)

15     {

16         st[total++]=num;

17         return;

18     }

19     int i,k=-1;

20     if(num==0)k=0;

21     for(i=0;i<n;i++)

22     {

23         if(!flag[i] && h[i]!=k)

24         {

25             flag[i]=1;

26             Dfs(x+1,num*10+h[i]);

27             flag[i]=0;

28             k=h[i];

29         }

30     }

31 }

32 

33 void make()

34 {

35     int i,j,k;

36     for(i=0;i<n;i++)

37     {

38         flag[i]=0;

39         scanf("%I64d",&h[i]);

40     }

41     sort(h,h+n);//排序

42     total=0;

43     Dfs(0,0);

44     memset(Dp,-1,sizeof(Dp));//初始化

45     for(i=0;i<total;i++)

46     {

47         for(j=1;j<=100;j++)

48         {

49             k=st[i]%j;

50             if(Dp[j][k]==-1 || Dp[j][k]>st[i])

51             {

52                 Dp[j][k]=st[i];//预处理

53             }

54         }

55     }

56     LL x,y;

57     while(m--)//询问

58     {

59         scanf("%I64d%I64d",&x,&y);

60         if(y==1)printf("%I64d\n",Dp[1][0]);

61         else

62         {

63             x%=y;

64             x=y-x;//互补

65             if(x==y)x=0;

66             if(Dp[y][x]==-1)printf("None\n");

67             else printf("%I64d\n",Dp[y][x]);

68         }

69     }

70 }

71 int main()

72 {

73     while(scanf("%I64d%I64d",&n,&m)==2)

74     {

75         make();

76     }

77     return 0;

78 }

 

你可能感兴趣的:(HDU)