题目链接http://www.bnuoj.com/v3/problem_show.php?pid=20172

题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解。

解题思路

看见模方程就想到中国剩余定理,然后看下确定的方程情况。

由乘法原理,共有II ki 种情况,即求解II ki 次。k比较大时基本完蛋。

其实解模方程还有一种暴力方法,就是选定一个模方程,令t=0,1...., n=t*LCM+余数(n一定要大于0)

通过t不断增大这种迭代方式从小到大创造一些可能解n,然后去测试其它方程,看余数对不对。

如果余数全对,那么就找到了一个解。否则就砍掉。

因为测试是很快的,大部分数据一开始就被砍了,所以k比较大时速度非常快。

毕竟上面是看RP的暴力,所以设定一个分界(10000),如果II ki <10000 ,那么还是通过中国剩余定理来求解,复杂度O(n)。

方法就是DFS枚举出C个余数情况,然后求解。

由于求出的全是最小整数解,S比较大时,剩余定理的解可能不足,这时候从小到大每个值加M的倍数凑出更大的解。

#include "cstdio"
#include "set"
#include "vector"
#include "algorithm"
using namespace std;
#define LL long long
#define LIMIT 10000
int C,S,s;
LL m[],k[],y[][],a[],M;
set<LL> value[];
vector<LL> ans;
void solve_violence(int bc)
{
for(int i=;i<=C;i++)
{
value[i].clear();
if(i!=bc) for(int j=;j<=k[i];j++) value[i].insert(y[i][j]);
}
for(int t=;S!=;t++)
{
for(int i=;i<=k[bc];i++)
{
LL n=t*m[bc]+y[bc][i];
if(!n) continue;
bool ok=true;
for(int j=;j<=C;j++)
{
if(j==bc) continue;
if(!value[j].count(n%m[j])) {ok=false;break;}
}
if(ok) {printf("%lld\n",n);if(--S==) return;}
}
}
}
LL ex_gcd(LL a,LL b,LL &x,LL &y)
{
if(a==&&b==) return -;
if(b==) {x=;y=;return a;}
LL d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
LL solve_china()
{
LL res=;M=;
for(int i=;i<=C;i++) M*=m[i];
for(int i=;i<=C;i++)
{
LL w=M/m[i],x,y;
ex_gcd(m[i],w,x,y);
y=(y*w%M+M)%M;
res=(res+y*a[i])%M;
}
return res;
}
void dfs(int dep)
{
if(dep>C)
{
ans.push_back(solve_china());
return;
}
for(int i=;i<=k[dep];i++)
{
a[dep]=y[dep][i];
dfs(dep+);
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&C,&S)&&C)
{
int bestc=;ans.clear();s=S;M=;
LL tot=;
for(int i=;i<=C;i++)
{
scanf("%lld%lld",&m[i],&k[i]);
tot*=k[i];
if(k[i]*m[bestc]<k[bestc]*m[i]) bestc=i;
for(int j=;j<=k[i];j++) scanf("%lld",&y[i][j]);
sort(y[i]+,y[i]++k[i]);
}
if(tot<LIMIT)
{
dfs();
sort(ans.begin(),ans.end());
for(int t=;S!=;t++)
for(int i=;i<ans.size();i++)
{
LL n=t*M+ans[i];
if(n>)
{
printf("%lld\n",n);
if(--S==) break;
}
}
}
else solve_violence(bestc);
printf("\n");
}
}
neopenx 445520 20172 Accepted GNU C++ 26 ms   2223 B 2015-02-06 23:10:03

UVA 11754 (暴力+中国剩余定理)的更多相关文章

  1. Uva 11754(枚举+中国剩余定理)

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  2. uva 11754 Code Feat (中国剩余定理)

    UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...

  3. UVA 11754 Code Feat 中国剩余定理+枚举

    Code FeatUVA - 11754 题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过. 一看便是个中国剩余定理,但是同余方程组就有 ...

  4. UVa 11754 (中国剩余定理 枚举) Code Feat

    如果直接枚举的话,枚举量为k1 * k2 *...* kc 根据枚举量的不同,有两种解法. 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解.解的个数不够S个 ...

  5. UVA 11754 Code Feat (枚举,中国剩余定理)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud C Code Feat   The government hackers at C ...

  6. uva11754 中国剩余定理+暴力搜索

    是当y的组合数较小时,暴力枚举所有组合,然后用中国剩余定理求每种组合的解,对解进行排序即可 注意初始解可能是负数,所以如果凑不够S个,就对所有解加上M,2M.... 当y的组合数较大时,选择一个k/x ...

  7. UVA 11754 - Code Feat(数论)

    UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...

  8. poj1006 ( hdu1370 ):中国剩余定理裸题

    裸题,没什么好说的 第一个中国剩余定理 写暴力都过了..可见这题有多水 代码: #include<iostream> #include<stdio.h> #include< ...

  9. [bzoj2142]礼物(扩展lucas定理+中国剩余定理)

    题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod  = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...

随机推荐

  1. 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型

    5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...

  2. jQuery - 1.简单的JQuery

    1.简单的JQuery 2.jQuery对象(包装集).Dom对象 3.JQuery提供的函数 1.简单的JQuery $(document).ready(function () { alert(&q ...

  3. 设计模式学习之观察者模式(Observer,行为型模式)(7)

    1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3 ...

  4. SQL集合操作符样例(UNION,INTERSECT,EXCEPT)

    由于MYSQL目前只实现了UNION, 所以后面两个就没得玩罗.... SELECT emp_id, assigned_branch_id -> FROM employee -> WHER ...

  5. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  6. oracle JOB学习(一)---基础

    oracle job简介   下面文章来自网友(格式稍加整理)   主要的使用情景 定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中,2:定时备份数据库等   熟化说万事开头难,这 ...

  7. HDU5489 Removed Interval(动态规划)

    一个长度为n的序列,删除任意长度为l的连续子序列后,求剩下的序列的最长公共子序列. 先求出以第i个元素为开始的LIS的长度,再一次循环,对所要求的结果更新 #include<iostream&g ...

  8. vim配置方法

    /etc/vimrc (公共的) ~/.vimrc (私人的) rpm -qa|grep vim 这个命令,如何vim已经正确安装,则会显示上面三个包的名称 全部安装 yum -y install v ...

  9. CI框架获取post和get参数 CodeIgniter

    请参考:CI文档的输入类部分: $this->input->post() $this->input->get() ------------------------------- ...

  10. 3D建模与处理软件简介

    [前言]自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具.笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D建模与处理方面 ...