UVa 11754 (中国剩余定理 枚举) Code Feat
如果直接枚举的话,枚举量为k1 * k2 *...* kc
根据枚举量的不同,有两种解法。
- 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解。解的个数不够S个的时候,要把这些解分别加上M、2M...(M = X1 * X2 *...* Xc)
- 如果上述枚举量太大的话,直接枚举x。找一个k/X最小的条件,然后让x = t * X + Yi开始枚举,因为这样枚举x增长得最快,所以枚举次数也就最少。如果符合要求的话则输出。
上面两种方法都要注意所找到的解为正整数。
typedef long long LL; void gcd(LL a, LL b, LL& d, LL& x, LL& y)
{
if(!b) { d = a; x = ; y = ; }
else { gcd(b, a%b, d, y, x); y -= x*(a/b); }
} LL china(int n, int* a, int* m)
{
LL M = , d, y, x = ;
for(int i = ; i < n; i++) M *= m[i];
for(int i = ; i < n; i++)
{
LL w = M / m[i];
gcd(m[i], w, d, d, y);
x = (x + y*w*a[i]) % M;
}
return (x+M)%M;
} #include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
using namespace std; const int maxc = ;
const int maxk = ;
const int LIMIT = ;
int C, S;
int bestc;
int X[maxc], Y[maxc][maxk], k[maxc];
set<int> values[maxc]; void solve_enum()
{
for(int c = ; c < C; c++) if(c != bestc)
{
values[c].clear();
for(int i = ; i < k[c]; i++)
values[c].insert(Y[c][i]);
} for(int t = ; S != ; t++)
{
for(int i = ; i < k[bestc]; i++)
{
LL n = (LL)t * X[bestc] + Y[bestc][i];//枚举解
if(n == ) continue;
bool ok = true;
for(int c = ; c < C; c++) if(c != bestc)//判断是否符合要求
if(!values[c].count(n % X[c])) { ok = false; break; }
if(ok) { printf("%lld\n", n); if(--S == ) { break; } }
}
}
} int a[maxc];
vector<LL> sol; void dfs(int d)
{
if(d == C) sol.push_back(china(C, a, X));
else for(int i = ; i < k[d]; i++)
{
a[d] = Y[d][i];
dfs(d + );
}
} void solve_china()
{
sol.clear();
dfs();
sort(sol.begin(), sol.end()); LL M = ;
for(int i = ; i < C; i++) M *= X[i]; for(int i = ; S != ; i++)
{
for(int j = ; j < sol.size(); j++)
{
LL n = M * i + sol[j];
if(n == ) continue;
printf("%lld\n", n);
if(--S == ) break;
}
}
} int main()
{
freopen("in.txt", "r", stdin); while(scanf("%d%d", &C, &S) == && C && S)
{
bestc = ;
int tot = ;
for(int c = ; c < C; c++)
{
scanf("%d%d", &X[c], &k[c]);
tot *= k[c];
if(k[c] * X[bestc] < k[bestc] * X[c]) bestc = c;
for(int i = ; i < k[c]; i++)
scanf("%d", &Y[c][i]);
sort(Y[c], Y[c] + k[c]);
} if(tot > LIMIT) solve_enum();
else solve_china();
printf("\n");
} return ;
}
代码君
UVa 11754 (中国剩余定理 枚举) Code Feat的更多相关文章
- UVA 11754 Code Feat 中国剩余定理+枚举
Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...
- UVA 11754 Code Feat (枚举,中国剩余定理)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud C Code Feat The government hackers at C ...
- uva 11754 Code Feat (中国剩余定理)
UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...
- 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
题意概述: 有一个正整数$N$满足$C$个条件,每个条件都形如“它除以$X$的余数在集合$\{Y_1, Y_2, ..., Y_k\}$中”,所有条件中的$X$两两互质, 你的任务是找出最小的S个解. ...
- UVA 11754 (暴力+中国剩余定理)
题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...
- UVA11754 - Code Feat
Hooray! Agent Bauer has shot the terrorists, blown upthe bad guy base, saved the hostages, exposed ...
- ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- POJ 1006 Biorhythms (中国剩余定理)
在POJ上有译文(原文右上角),选择语言:简体中文 求解同余方程组:x=ai(mod mi) i=1~r, m1,m2,...,mr互质利用中国剩余定理令M=m1*m2*...*mr,Mi=M/mi因 ...
随机推荐
- 【笔记】UML核心元素
1.参与者 定义:在系统之外与系统交互的某人或某物. 特点:1.可以非人:2.与系统直接交互:3.主动发出动作并获得反馈:4.涉众(stakerholder)的代表 具有两个版型: 1.业务主角(bu ...
- [设计模式] 18 备忘录模式Memento Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...
- VisionTimer BUG && Start
void Start() { vp_Timer.In(0.0f, delegate() { Debug.Log("Start"); }, 10, 1.0f); } Version ...
- php浮点数精确运算
php浮点数精确运算 Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(strin ...
- zoj 2777 Visible Lattice Points(欧拉函数,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...
- maven_Error building POM (may not be this project's POM)错误
如果maven项目在执行编译等操作时报如题错误的话,请仔细检查pom.xml,一般是由pom的语法错误导致的,例如我的项目是因为: dependencies 元素下不应该有properties元素导致 ...
- lintcode 中等题:Max Points on a Line 最多有多少个点在一条直线上
题目 最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- C++Builder和VC的比较
C++Builder和VC的比较 其实很久以前我就想写这篇文章,其原因一方面是因为笔者深深感觉到C++ Builder的确是一个先进与强大的程式开发工具,但更最重要的一点是,我深信C++ Builde ...
- java:打包
包名命名规范: 1.包名全部小写 2.包名一般情况下是域名的倒过来写+个性命名,如:tinyphp.com,就写成com.tinyphp+.xxx 打包方法 package + 包名 package ...