转载请注明出处: 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 2642 Stars

    Problem Description Yifenfei is a romantic guy and he likes to count the stars in the sky. To make t ...

  2. 犯罪团伙 codevs 3554

    这是一道经典的水题,提供两种方法:①深搜  ②并查集 NO.1 深度优先搜索: #include<iostream>#include<cstdio>#include<al ...

  3. 客户端技术:Cookie 服务端技术:HttpSession

    客户端技术:Cookie 服务端技术:HttpSession 07. 五 / android基础 / 没有评论   一.会话技术1.什么是会话:客户打开浏览器访问一个网站,访问完毕之后,关闭浏览器.这 ...

  4. 空值排序(oracle/sqlserver)

    oracle认为 null 最大. 升序排列,默认情况下,null值排后面. 降序排序,默认情况下,null值排前面. 改变空值办法: (1)用nvl函数或decode函数将null转换为一特定值 替 ...

  5. 01--从根源种子CCNode说起

    CCNode作为渲染框架的基类(暂且这样理解,CCObject为引擎基类)其中定义了绘制游戏元素相关的属性以及相关方法.属性当中需要注意的一个是Z坐标,在渲染框架中用来表示元素的遮挡关系,其值越小越容 ...

  6. symfony2 登录验证(转自http://www.newlifeclan.com/symfony/archives/300)

    注意:如果你需要为存储在某种数据库中的用户做一个登录表单,那么你应该考虑使用FOSUserBundle,这有助于你建立你的User对象,还为您提供了常见的登录.注册.忘记密码的路由和控制器. 在此文章 ...

  7. python学习第二天 --变量及其字符串

    python变量: 在计算机程序中,变量不仅可以是数字,还可以是任意数据类型. 在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线(_)的组合,且不能用数字开头. 在P ...

  8. java形参是否会改变实参

    之前一直对java这方面感到困惑---传入的形参是否会影响实参.因为c++有指针,而java没有,所以我做一个测试验证形参是否会影响实参.* 首先第一种情况---基本类型 哈哈,其实结果大概和我想的一 ...

  9. [HDU] 3711 Binary Number [位运算]

    Binary Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  10. Netbeans使用Xdebug调试的配置

    在phpinfo()信息里找到php.ini的位置并打开php.ini在文档最后添加如下代码: 注释原来xdebug配置 xdebug.remote_enable=onxdebug.remote_ha ...