码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1755 数学 ***

时间:2015-07-26 23:58:12      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

链接:点我

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

 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 1755 数学 ***

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4678932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!