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个解. 解题思路: 看见模方程 ...
随机推荐
- Combination Sum,Combination Sum II,Combination Sum III
39. Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique co ...
- web app之rem
rem是什么? rem:font size of the root element,是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位. em:font size of the elemen ...
- 优化PHP代码的40条建议(转载)
[size=5][color=Red](译文)优化PHP代码的40条建议[/color][/size] 40 Tips for optimizing your php Code 原文地址:http:/ ...
- 畅通工程续--hdu1874
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- NSScanner-备
注意:在扫描的时候,如果 空格是不需要扫描的,那么将会忽略空格. 如下代码: 1 NSString *string = @"my age is d 23 34.0"; ...
- MVC入门之.Net语法学习
本节中主要学习.Net框架性语法.开发者可以使用新语法提高编程的效率以及代码的运行效率:其本质都是“语法糖”,由编译器在编译时转成原始语法. u 自动属性 Auto-Implemented Prop ...
- NOI十连测 第五测 T2
思路:考虑建立可持久化线段树,第一层维护的是i这个位置的next位置,第二层,维护的是接下来走这个字符会到哪个节点. 感觉很巧妙啊,不愧是Claris #include<algorithm> ...
- LeetCode_Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 在Bash中,如何判断某个命令是否存在?
if ! type "$foobar_command_name" > /dev/null; then # install foobar here,or poping up s ...
- leetcode_question_114 Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 4 6 ...