Hooray!  Agent Bauer has shot the terrorists, blown upthe bad guy base, saved the hostages, exposed the moles in the government,prevented an environmental catastrophe, and found homes for three orphanedkittens, all in the span of 19 consecutive hours.  But now, he only has 5 hours remaining todeal with his final challenge: an activated nuclear bomb protected by asecurity code.  Can you help him figureout the code and deactivate it?  Eventsoccur in real time.

The governmenthackers at CTU (Counter-Terrorist Unit) have learned some things about thecode, but they still haven't quite solved it.They know it's a single, strictly positive, integer.  They also know several clues of the form "whendivided by X, the remainder is one of {Y1, Y2, Y3, ...,Yk}".There are multiple solutions to these clues, but the code is likely tobe one of the smallest ones.  So they'dlike you to print out the first few solutions, in increasing order.

The world iscounting on you!

Input

Input consistsof several test cases.  Each test casestarts with a line containing C, the number of clues (1 <= C <= 9), andS, the number of desired solutions (1 <= S <= 10).  The next C lines each start with two integersX (2 <= X) and k (1 <= k <= 100), followed by the k distinct integersY1, Y2, ..., Yk (0 <= Y1,Y2, ..., Yk < X).

You may assumethat the Xs in each test case are pairwise relativelyprime (ie, they have no common factor except 1).  Also, the product of the Xs will fit into a32-bit integer.

The last testcase is followed by a line containing two zeros.

Output

For each testcase, output S lines containing the S smallest positive solutions to the clues,in increasing order.

Print a blankline after the output for each test case.

Sample Input                              

Sample Output

 

3 2

2 1 1

5 2 0 3

3 2 1 2

0 0

5

13

 

思路:中国剩余定理+暴力;

首先我们肯定会想到dfs暴力枚举,这种情况只有当所有k的乘积很小的情况下才行,这个时候我们采取dfs+中国剩余定理;当k的乘积很大的情况下,

考虑选择一个K/X最小的条件,然后枚举所有符合这个条件的数n,即 tX+Yi ,t=0,1,2.... 然后依次判断这个n是否符合其它所有条件,因为这个时候x的增量很大。

  1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 #include <map>
6 #include <vector>
7 #include <set>
8 typedef long long LL;
9 using namespace std;
10 typedef struct node
11 {
12 int x;
13 int y;
14 int bns[105];
15 double b;
16 } ss;
17 set<LL>ask;
18 set<LL>::iterator it;
19 set<int>val[20];
20 ss ans[20];
21 int a[20];
22 void dfs(int x,int y);
23 LL china(int x);
24 pair<LL,LL>ex_gcd(LL n,LL m);
25 void slove__x(int n,int id,int m);
26 LL R;
27 bool cmp(node p,node q)
28 {
29 return p.b < q.b;
30 }
31 int main(void)
32 {
33 int n,m;
34 while(scanf("%d %d",&n,&m)!=EOF)
35 {
36 if(n==0||m==0)break;
37 int i,j;
38 int id = 0;
39 LL um = 1;
40 for(i = 0; i < n; i++)
41 {
42 scanf("%d",&ans[i].x);
43 scanf("%d",&ans[i].y);
44 for(j = 0; j < ans[i].y; j++)
45 {
46 scanf("%d",&ans[i].bns[j]);
47 }
48 sort(ans[i].bns,ans[i].bns+ans[i].y);
49 if(ans[id].x*ans[i].y<ans[i].x*ans[id].y)id=i;
50 um *= ans[i].y;
51 ans[id].b = 1.0*ans[i].y/ans[i].x;
52 }
53 sort(ans,ans+n,cmp);
54 if(um <= 10000)
55 {
56 ask.clear();
57 R = 1;
58 for(i = 0 ; i < n; i++)
59 {
60 R *= ans[i].x;
61 }
62 dfs(0,n);
63 int cn = 0;
64 for(i = 0 ; m!=0; i++)
65 {
66 for(it = ask.begin(); it!=ask.end(); it++)
67 {
68 LL tt = *it + i*R;
69 if(tt > 0)
70 {
71 m--;
72 printf("%lld\n",tt);
73 if(m==0)
74 break;
75 }
76 }
77 }
78 }
79 else
80 {
81 slove__x(n,id,m);
82 }
83 printf("\n");
84 }
85 return 0;
86 }
87 void dfs(int x,int y)
88 {
89 if(x == y)
90 {
91 ask.insert(china(y));
92 return ;
93 }
94 else for(int i = 0; i < ans[x].y; i++)
95 {
96 a[x] = ans[x].bns[i];
97 dfs(x+1,y);
98 }
99 }
100 LL china(int x)
101 {
102 int i,j;
103 LL sum = 0;
104 LL ac = 1;
105 ac = R;
106 for(i = 0; i < x; i++)
107 {
108 LL ak = ac/ans[i].x;
109 pair<LL,LL>cc = ex_gcd(ak,ans[i].x);
110 LL aa = cc.first;
111 aa = (aa%ans[i].x + ans[i].x)%ans[i].x;
112 sum = sum + ((aa*ak%ac)*a[i])%ac;
113 sum %= ac;
114 sum += ac;
115 sum %= ac;
116 }
117 return sum;
118 }
119 pair<LL,LL>ex_gcd(LL n,LL m)
120 {
121 if(m == 0)
122 return make_pair(1,0);
123 else
124 {
125 pair<LL,LL>ac = ex_gcd(m,n%m);
126 return make_pair(ac.second,ac.first-(n/m)*ac.second);
127 }
128 }
129 void slove__x(int n,int id,int m)
130 {
131 int i,j;
132 for(i = 0; i < n; i++)
133 val[i].clear();
134 for(i = 0; i < n; i++)
135 {
136 for(j = 0; j < ans[i].y; j++)
137 {
138 val[i].insert(ans[i].bns[j]);
139 }
140 }
141 for(i = 0; m != 0; i++)
142 {
143 for(j = 0; j < ans[id].y; j++)
144 {
145 LL ak = (LL)i*(LL)ans[id].x + ans[id].bns[j];
146 if(ak > 0)
147 {
148 int flag = 0;
149 for(int c = 0; c < n; c++)
150 {
151 if(c!=id)
152 {
153 if(!val[c].count(ak%ans[c].x))
154 {
155 flag = 1;
156 break;
157 }
158 }
159 }
160 if(!flag)
161 {
162 printf("%lld\n",ak);
163 m--;
164 }
165 if(m==0)break;
166 }
167 }
168 }
169 }

UVA11754 - Code Feat的更多相关文章

  1. UVA 11754 Code Feat (枚举,中国剩余定理)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud C Code Feat   The government hackers at C ...

  2. UVA 11754 - Code Feat(数论)

    UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...

  3. Uva 11754 Code Feat

    题意概述: 有一个正整数$N$满足$C$个条件,每个条件都形如“它除以$X$的余数在集合$\{Y_1, Y_2, ..., Y_k\}$中”,所有条件中的$X$两两互质, 你的任务是找出最小的S个解. ...

  4. UVA 11754 Code Feat 中国剩余定理+枚举

    Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...

  5. UVa 11754 (中国剩余定理 枚举) Code Feat

    如果直接枚举的话,枚举量为k1 * k2 *...* kc 根据枚举量的不同,有两种解法. 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解.解的个数不够S个 ...

  6. UVA 11754 Code Feat 中国剩余定理+暴力

    lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...

  7. UVA - 11754 Code Feat (分块+中国剩余定理)

    对于一个正整数N,给出C组限制条件,每组限制条件为N%X[i]∈{Y1,Y2,Y3,...,Yk[i]},求满足条件的前S小的N. 这道题很容易想到用中国剩余定理,然后用求第k小集合的方法输出答案.但 ...

  8. uva 11754 Code Feat (中国剩余定理)

    UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...

  9. [kuangbin带你飞]专题十四 数论基础

            ID Origin Title   111 / 423 Problem A LightOJ 1370 Bi-shoe and Phi-shoe   21 / 74 Problem B ...

随机推荐

  1. CMSIS-RTOS 信号量Semaphores

    信号量Semaphores 和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器.当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个 ...

  2. kubernetes部署Docker私有仓库Registry

    在后面的部署过程中,有很多的docker镜像文件,由于kubernetes是使用国外的镜像,可能会出现下载很慢或者下载不下来的情况,我们先搭建一个简单的镜像服务器,我们将需要的镜像下载回来,放到我们自 ...

  3. JForum论坛安装以及部署

    转载链接:https://blog.csdn.net/jhyfugug/article/details/79467369 首先安装JForum之前,先准备好安装环境Windows7+JDK+Tomca ...

  4. Prometheus基础

    监控系统作用 监控系统主要用于保证所有业务系统正常运行, 和业务的瓶颈监控. 需要周期性采集和探测. 采集的详情 采集: 采集器, 被监控端, 监控代理, 应用程序自带仪表盘, 黑盒监控, SNMP. ...

  5. 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释

    #1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...

  6. 查看linux系统CPU和内存命令

    cat /proc/cpuinfo查看linux系统的CPU型号.类型以及大小,如下图所示.   通过greap命令根据Physical Processor ID筛选出多核CPU的信息.   cat ...

  7. mango后台

     环境搭建 项目配置 下载后导入项目,删除mvnw.mvnw.cmd两个文件 修改spring-boot-starter-web pom.xml --> run as --> mave i ...

  8. Hadoop生态圈学习-1(理论基础)

    一.大数据技术产生的背景 1. 计算机和信息技术(尤其是移动互联网)的迅猛发展和普及,行业应用系统的规模迅速扩大(用户数量和应用场景,比如facebook.淘宝.微信.银联.12306等),行业应用所 ...

  9. Layui:select下拉框回显

    一..需求场景分析 基于Thymeleaf模板下的layui下选框回显. 二.获得一个Layui标配的下拉框,我们需要在html中填写的内容如下 <div class="layui-f ...

  10. Android Service VS AsyncTask VS Thread

    这三种方式的设计目的是不同的. Service: 适用于在后台长期持续运行的动作,如:播放音乐,查看网络数据.注意,在开发文档中,service本身是在UI线程中,所以所需的操作应该创建一个新的线程来 ...