题目链接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. 1.4 算法 - algorithm

    1)概述 2)示例 //algorithm find演示 #include <vector> #include <algorithm> #include <iostrea ...

  2. php 审核管理

    权限管理界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  3. Jquery学习笔记--性能优化建议

    一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...

  4. MySQL replace函数替换字符串语句的用法(mysql字符串替换)

    MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪. 最近在研究CMS,在数据转换的时候需要用 ...

  5. html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  6. 攻城狮在路上(叁)Linux(零)--- 软件环境、参考书目等一览表

    1.参考书目:鸟哥的Linux私房菜. 2.环境: Cent_os.

  7. PHPCMS 实现上一篇下一篇的几种方法

    1第一种 <p>上一篇:{get sql = "select contentid,catid,url,titlee from phpcms_content where conte ...

  8. 有了iscsi存储怎么让主机识别以及使用创建lvm

    1.查找安装包:rpm -ivh iscsi-initiator-utils去sf.net下载iscsitarget包make kernel,usr,install开启服务 (0)查看iscsi发现记 ...

  9. 遍历List过程中删除元素的正确做法(转)

    遍历List过程中删除元素的正确做法   public class ListRemoveTest {     3 public static void main(String[] args) { 4 ...

  10. Codeforces Round #130 (Div. 2) C. Police Station

    题目链接:http://codeforces.com/contest/208/problem/C 思路:题目要求的是经过1~N的最短路上的某个点的路径数 /  最短路的条数的最大值.一开始我是用spf ...