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因 ...
随机推荐
- android 中使用回调方法(适用于自定义view传值到activity、adapter传值到activity)
如图所示: 每当listview中有选中的操作时都需要发消息给activity,用来实时改变真实需要支付的剩余金额. 代码暂不公开啦!公司项目!
- FlashBuilder 4.7 破解方法
|举报|字号订阅 方法一: 方法问题: 能破解,但破解后启动FB需等待较长时间,等一两分钟吧. 操作步骤: 与其它Adobe CS6破解方法相同,覆盖安装目录下的amtlib.dll文件即可.(文 ...
- DataGridView 的cell赋值没有线程间访问的限制吗?
1.如下代码,对DataGridView 的cell赋值不会出现线程访问问题,为什么呢? public Form1() { InitializeComponent(); } private void ...
- 【CodeForces】【148D】Bag of mice
概率DP kuangbin总结中的第9题 啊……题目给的数据只有白鼠和黑鼠的数量,所以我们只能在这个上面做(gao)文(D)章(P)了…… 明显可以用两种老鼠的数量来作为状态= = 我的WA做法: 令 ...
- WCF入门(七)——异常处理1
首先以一个简单的例子演示一下远程调用发生异常的结果: 服务器端代码如下: [ServiceContract] public interface IService1 { [OperationContra ...
- Java Notes
1.java是解释型语言.java虚拟机能实现一次编译多次运行. 2.JDK(java software Development kit 软件开发包),JRE(java Runtime Environ ...
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...
- 套题T2
数学(math.cpp) DXY的数学很差... 对于所有1<=i<=N求(2^i – i^2)能被7整除的个数.(N<=1000000) 样例输入: 3 样例输出: 1 你在代码中 ...
- My_Plan part1 小结
数位DP AC十道题目以上 成就达成 八月份!三个月!想想就令人兴奋呢 开始写总结啦 貌似简单的数位DP只需要改改模板就可以啦 就按照我的做题顺序开始总结吧 先是学习了一发模板:http://www. ...
- *[hackerrank]Sam and sub-strings
https://www.hackerrank.com/contests/w3/challenges/sam-and-substrings DP.注意到以N[i]结尾的每个字符串的子数字和有规律: 53 ...