转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud

C

Code Feat

 

The government hackers at CTU (Counter-Terrorist Unit) have learned some things about the code, 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 "when divided by X, the remainder is one of {Y1, Y2, Y3, ...,Yk}".There are multiple solutions to these clues, but the code is likely to be one of the smallest ones.  So they'd like you to print out the first few solutions, in increasing order.

The world is counting on you!

Input

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

You may assume that the Xs in each test case are pairwise relatively prime (ie, they have no common factor except 1).  Also, the product of the Xs will fit into a 32-bit integer.

The last test case is followed by a line containing two zeros.

Output

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

Print a blank line 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

 

Problem Setter: Derek Kisman, Special Thanks: SameeZahur

当所有k的乘积较小时,直接枚举出所有的情况,然后用中国剩余定理(CRT)即可求解;

当所有k的乘积较大时,直接枚举所有值,判断是否符合即可。注意k/x越小越好,这样t*x+yi足够大,很快就能找到。

 #include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
long long X[],K[],Y[][];
vector<long long >vec;
set<int>val[];
long long c,s;
long long mod;
int minn=;
typedef long long ll;
void ext_gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b){d=a;x=;y=;}
else
{
ext_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
ll a[];
ll CRT()
{
ll d,x,y,ret=;
ll temp;
for(int i=;i<c;i++)
{
temp=mod/X[i];
ext_gcd(X[i],temp,d,x,y);
ret=(ret+y*temp*a[i])%mod;
}
return (ret+mod)%mod;
}
void dfs(int d)
{
if(d==c)vec.push_back(CRT());
else
{
for(int i=;i<K[d];i++)
{
a[d]=Y[d][i];
dfs(d+);
}
}
}
void solve1()
{
vec.clear();
dfs();
sort(vec.begin(),vec.end());
int size=vec.size();
int num=;
for(int i=;;i++)
{
for(int j=;j<size;j++)
{
ll ans=mod*i+vec[j];
if(ans>)
{
printf("%lld\n",ans);
num++;
if(num==s)return ;
}
}
}
}
void solve2()
{
for(int i=;i<c;i++)
{
if(i!=minn)
{
val[i].clear();
for(int j=;j<K[i];j++)
{
val[i].insert(Y[i][j]);
}
}
}
ll ans=;
bool ok=;
int num=;
for(int i=;;i++)
{
for(int j=;j<K[minn];j++)
{
ans=X[minn]*i+Y[minn][j];
if(ans<=)continue;
ok =;
for(int k=;k<c;k++)
{
if(k!=minn&&!val[k].count(ans%X[k]))
{
ok=;
break;
}
}
if(ok)
{
printf("%lld\n",ans);
num++;
if(num==s)return;
}
}
}
}
int main()
{
while(scanf("%lld%lld",&c,&s)==&&(c||s))
{
if(c==&&s==)break;
mod=;
minn=;
long long k=;
for(int i=;i<c;i++)
{
scanf("%lld%lld",&X[i],&K[i]);
mod*=X[i];
k*=K[i];
for(int j=;j<K[i];j++)
{
scanf("%lld",&Y[i][j]);
}
sort(Y[i],Y[i]+K[i]);
if(K[i]*X[minn]>K[minn]*X[i])minn=i;
}
if(k>)solve2();
else solve1();
printf("\n"); }
return ;
}

UVA 11754 Code Feat (枚举,中国剩余定理)的更多相关文章

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

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

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

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

  3. UVA 11754 - Code Feat(数论)

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

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

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

  5. Uva 11754 Code Feat

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

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

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

  7. Uva 11754(枚举+中国剩余定理)

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

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

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

  9. UVA 11754 (暴力+中国剩余定理)

    题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...

随机推荐

  1. hdu 1215 七夕节

    Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...

  2. c#快捷键设置和text输入限制

    快捷键 使用KeyDonw事件 输入限制使用 KeyPress 事件 1.注意:如果是整个窗体的快捷键,一定要把窗体属性中的KeyPreview改为true private void textbox_ ...

  3. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  4. 【HDU1198】Farm Irrigation(回溯+记忆化搜索)

    数据流小,深搜即可.有些暴力.看其他人的题解用二维转换成一维做的并查集很巧妙,马上去研究一下!! #include <iostream> #include <cstring> ...

  5. 线段树(build,insert,dfs操作)

    模板原型: 解决零散数点在已知线段上的出现次数.思想是将线段用长线覆盖,将长线转化成线段树.用权值记录各个数点出现的次数,最后进行查询.代码解释见注释. #include <bits/stdc+ ...

  6. yum笔记

    rpm --> yum HTML: HyperText Mark LanguageXML: eXtended Mark Language XML, JSON: 半结构化的数据 yum仓库中的元数 ...

  7. Android --- 字符串\n的换行问题

    我的一段文字"测试文本\n测试文本\n测试文本\n测试文本\n测试文本\n测试文本\n". 该段文字放在一个txt文本内. 我用流读取后,显示在一个TextView里. 我期望的显 ...

  8. FFmpeg缩放swscale详解 <转>

    利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW ...

  9. [Hapi.js] Serving static files

    hapi does not support serving static files out of the box. Instead it relies on a module called Iner ...

  10. 解决Xcode6.4安装插件后插件不能使用的问题

    下面是上网查的方法,综合了一下,亲测 原因: 苹果要求加入UUID证书从而保证插件的稳定性. 解决方法: 一.查看Xcode的UUID 在终端执行 defaults read /Application ...