是当y的组合数较小时,暴力枚举所有组合,然后用中国剩余定理求每种组合的解,对解进行排序即可

注意初始解可能是负数,所以如果凑不够S个,就对所有解加上M,2M。。。。

当y的组合数较大时,选择一个k/x最小的序列,枚举N=x*t+y,外层枚举t,内层枚举y,然后验证N是否是可行解

为什么要选k/x最小的:就是相对于x,k越小越好,使更多机会枚举t,

#include<bits/stdc++.h>
#include<vector>
#include<set>
using namespace std;
#define maxn 105
#define ll long long int c,s,x[maxn],k[maxn],y[maxn][maxn],now;
set<int> value[maxn];
vector<ll> ans;
ll a[maxn]; //以下是枚举N的解法,找到 k/x 最小的条件,按照t=0,1,2..的顺序枚举 N = X*t+Y
void solve_enum(){
for(int i=;i<c;i++){
if(c==now)continue;
value[i].clear();
for(int j=;j<k[i];j++)
value[i].insert(y[i][j]);//放到集合里去重
} for(int t=;;t++){
for(int i=;i<k[now];i++){
ll n=(ll)x[now]*t+y[now][i];
if(n==)continue; //验证n是否是可行解
bool ok=;
for(int i=;i<c;i++){
if(i==now)continue;
if(!value[i].count(n%x[i])){
ok=;
break;
}
} if(ok){
cout<<n<<endl;
if(--s==)return;
}
}
}
} //以下是暴力枚举每个组合方案的解法
long long exgcd(long long a, long long b, long long &x, long long &y) {//比较好的exgcd()
if (!b) {x = ; y = ; return a;}
long long d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
ll china(){//mx+ny=1
ll M=,ans=;
for(int i=;i<c;i++)M*=x[i];
for(int i=;i<c;i++){
ll w=M/x[i],xx,yy;
exgcd(x[i],w,xx,yy);//拓展欧几里得解出
ans=(ans+w*yy*a[i])%M;
}
return (ans+M)%M;
} void dfs(int d){
if(d==c){
ans.push_back(china());//用中国剩余定理求出当前组合的结果
return;
}
for(int i=;i<k[d];i++){
a[d]=y[d][i];
dfs(d+);
}
}
void solve_china(){
ans.clear();
dfs();//一轮搜索出组合内的所有可行解
sort(ans.begin(),ans.end());//排序答案
ll M=;
for(int i=;i<c;i++)M*=x[i]; for(int i=;;i++)
for(int j=;j<ans.size();j++){
ll n=M*i+ans[j];
if(n>){
cout<<n<<endl;
if(--s==)
return;
}
}
} int main(){
while(cin>>c>>s && c && s){
now=;
ll sum=;
for(int i=;i<c;i++){
cin>>x[i]>>k[i];
sum*=k[i];
if(k[i]*x[now]<k[now]*x[i])
now=i;//找到k/x最小的条件,按照t=0,1,2..的顺序枚举 N = X*t+Y
for(int j=;j<k[i];j++)
cin>>y[i][j];
sort(y[i],y[i]+k[i]);//从小到大排序
}
if(sum>)
solve_enum();//当y组合较多时直接枚举N
else solve_china();//当y组合不是很多时枚举所有可能
puts("");
}
}

uva11754 中国剩余定理+暴力搜索的更多相关文章

  1. UVA 11754 Code Feat 中国剩余定理+暴力

    lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...

  2. HDU1370Biorhythms(中国剩余定理||暴力)

    Some people believe that there are three cycles in a person's life that start the day he or she is b ...

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

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

  4. UVA 11754 (暴力+中国剩余定理)

    题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...

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

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

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

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

  7. [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告

    题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...

  8. 清北学堂-DAY2-数论专题-中国剩余定理(CRT)

    首先请看定义:(百科上抄下来的)孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国余数定理. 一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作&l ...

  9. Java-POJ1006-Biorhythms(中国剩余定理)

    https://blog.csdn.net/shanshanpt/article/details/8724769 有中文题面,就不解释了. 妥妥的中国剩余定理没跑了. Java跑得慢,一点办法也没有, ...

随机推荐

  1. Flask表单(form)的应用

    导入模块request模块 #指定请求方式,使用methods属性 @app.route("/",methods=['GET','POST']) def index(): #判断c ...

  2. scrapy基本使用(一)

    scrapy基本使用(一) 参考文档:Scrapy入门教程 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html scrapy ...

  3. ActiveMQ 动态网络链接

    ActiveMQ的broker-broker方式有两种,一种 静态连接一种是动态连接,一般使用静态连接,动态连接了解就好,没有过多的去测试. 1. 多播协议multicast ActiveMQ使用Mu ...

  4. go byte 和 string 类型之间转换

    string 不能直接和byte数组转换 string可以和byte的切片转换 1,string 转为[]byte var str string = "test" var data ...

  5. window10 matlabR2015b 安装minGw

    第一步:下载TDM-GCC(注意看清是32位还是64位),TDM-GCC的安装路径不要包括空格: http://tdm-gcc.tdragon.net/download 第二步:点击“我的电脑”右键“ ...

  6. xpath 中 [<Element a at 3985984dj343>]

    在写爬虫用xpath抓取数据的时候出现了这个问题,列表中都是很多个 < element > 首先这不是报错,也不是你的xpath语法有错. 将这个数据列表循环,循环出的item就是你想要的 ...

  7. Unity3D之Mesh(四)绘制多边形

    来自https://www.cnblogs.com/JLZT1223/p/6086191.html 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思 ...

  8. logging模块--日志文件

    初级的使用配置模式类似与print 默认打印waring等级及以上--通过更改等级来测试代码 logging.debug("debug no china") #调试模式 loggi ...

  9. 高效的多维空间点索引算法 — Geohash 和 Google S2

    原文地址:https://www.jianshu.com/p/7332dcb978b2   引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面:     app ...

  10. <TCP/IP>Internet地址结构回顾

    本章介绍了Internet中使用的网络层地址,又称IP地址. 要想在网上冲浪,一个设备至少要有一个IP地址(PS:我用赛风FQ的时候,居然自动更换了IP地址,顿时感觉很神奇但是不知道为什么) ***成 ...