UVA 11754 Code Feat (枚举,中国剩余定理)
转载请注明出处: 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 (枚举,中国剩余定理)的更多相关文章
- uva 11754 Code Feat (中国剩余定理)
UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...
- UVA - 11754 Code Feat (分块+中国剩余定理)
对于一个正整数N,给出C组限制条件,每组限制条件为N%X[i]∈{Y1,Y2,Y3,...,Yk[i]},求满足条件的前S小的N. 这道题很容易想到用中国剩余定理,然后用求第k小集合的方法输出答案.但 ...
- UVA 11754 - Code Feat(数论)
UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...
- UVA 11754 Code Feat 中国剩余定理+枚举
Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...
- Uva 11754 Code Feat
题意概述: 有一个正整数$N$满足$C$个条件,每个条件都形如“它除以$X$的余数在集合$\{Y_1, Y_2, ..., Y_k\}$中”,所有条件中的$X$两两互质, 你的任务是找出最小的S个解. ...
- UVA 11754 Code Feat 中国剩余定理+暴力
lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...
- Uva 11754(枚举+中国剩余定理)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- UVa 11754 (中国剩余定理 枚举) Code Feat
如果直接枚举的话,枚举量为k1 * k2 *...* kc 根据枚举量的不同,有两种解法. 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解.解的个数不够S个 ...
- UVA 11754 (暴力+中国剩余定理)
题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...
随机推荐
- Oracle11g R2学习系列 之六数据库链接,快照及序列
Create public database link link_name Connect to user identified by password using 'DBName' 为'DBName ...
- JavaScript 语法陷阱
没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量 ...
- Linux下的正则表达式(基础)
grep -n 'the' text.txt 搜寻含有the的部分(n代表现实显示行号) grep -vn 'the' text.txt 搜寻不含有the的部分(n代表现实显示行号) grep -vn ...
- PHP面向对象编程快速入门
面向对象编程(OOP)是我们编程的一项基本技能,PHP4对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就通 ...
- 启动安卓模拟器报错 emulator: ERROR: x86_64 emulation currently requires hardware acceleration! CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1) 解决办法
启动安卓模拟器报错 emulator: ERROR: x86_64 emulation currently requires hardware acceleration! CPU accelerat ...
- 【CCNA学习笔记】1.思科路由器的基本配置
教学视频来源:http://edu.51cto.com/lesson/id-10930.html. 怎么安装模块.连交叉线什么的视频里面老师说的很清楚了,我只记录一下IOS配置的命令(虽然一副不明觉厉 ...
- #include<iostream>与#include<iostream.h>的区别
转载于祝长洋的BLOG:http://blog.sina.com.cn/s/blog_514b5f600100ayks.h ...
- PowerShell_零基础自学课程_9_高级主题:静态类和类的操作
上次我们说到了,wmi对象和com组件,今天我们继续来看PS中对象的相关内容.主要说一下静态对象和对象的基本操作. 一.静态对象 在PS中有一类特殊的对象,我们不能同过这些类创建新的对象,这些类是不能 ...
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
转帖:http://blog.csdn.net/whygosofar/article/details/2821875 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Lib ...
- 【转】 Git 常用命令详解(二)----不错
原文网址:http://blog.csdn.net/ithomer/article/details/7529022 Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: ...