uva11754 中国剩余定理+暴力搜索
是当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 中国剩余定理+暴力搜索的更多相关文章
- UVA 11754 Code Feat 中国剩余定理+暴力
lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...
- HDU1370Biorhythms(中国剩余定理||暴力)
Some people believe that there are three cycles in a person's life that start the day he or she is b ...
- uva 11754 Code Feat (中国剩余定理)
UVA 11754 一道中国剩余定理加上搜索的题目.分两种情况来考虑,当组合总数比较大的时候,就选择枚举的方式,组合总数的时候比较小时就选择搜索然后用中国剩余定理求出得数. 代码如下: #includ ...
- UVA 11754 (暴力+中国剩余定理)
题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...
- poj1006 ( hdu1370 ):中国剩余定理裸题
裸题,没什么好说的 第一个中国剩余定理 写暴力都过了..可见这题有多水 代码: #include<iostream> #include<stdio.h> #include< ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告
题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...
- 清北学堂-DAY2-数论专题-中国剩余定理(CRT)
首先请看定义:(百科上抄下来的)孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国余数定理. 一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作&l ...
- Java-POJ1006-Biorhythms(中国剩余定理)
https://blog.csdn.net/shanshanpt/article/details/8724769 有中文题面,就不解释了. 妥妥的中国剩余定理没跑了. Java跑得慢,一点办法也没有, ...
随机推荐
- HDFS笔记(一)
1. HDFS 是什么? Hadoop分布式文件系统(Distributed File System)-HDFS(Hadoop Distributed File System) 2. HDFS 架构 ...
- Python18 Django 基础
本节内容 上节项目基础语法补充 Django请求的生命周期 通过这张图,我们可以很好的解释一下这个问题. Django请求的生命周期是由客户端的请求开始:经由路由系统找到相对应的视图函数:视图函数到h ...
- .net+mvc,ueditor
.net+mvc的百度编辑器ueditor 一.下载百度编辑器:http://ueditor.baidu.com/website/download.html 选择.net版本 二.解压后在mvc项目中 ...
- 在IntelliJ IDEA 中配置Ueditor富文本插件
这是我自学的配置教程,刚刚学习不太完善请谅解! 我会根据我的学习进程对此进行更贴,欢迎关注哦 ! 第一步:下载插件,地址:http://ueditor.baidu.com/website/downlo ...
- Nginx安装及配置详解【转】
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- better-scroll和swiper使用中的坑
better-scroll 1.我的 better-scroll 初始化了, 但是没法滚动. 按照文档使用后,发现可以原生滚动,但是不能弹性滑动,后面发现是最外层容器没给设置固定高度 ,设置固定 ...
- c++学习day3(字符串_指针)
1.字符串 1)三种形式 用双引号括起来的字符串常量:结尾会有一个'\0'字符,但该字符只占据字节数,不会使字符串长度增加. 存放于字符数组中,以'\0'字符结尾:数组元素个数应至少为字符串长度+1 ...
- 利用C#进行AUTOCAD的二次开发
众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...
- struts2框架学习之第三天
day03 上传下载 1 上传下载组件介绍 l jspSmartUpload(model1的年代): l apache-commons-fileupload,Struts2默认上传组 ...
- oracle 会话 解锁
背景 这是当年第一次记录博客,当初记录的原因是感觉有些问题很少碰到,碰到有网上寻找一遍,文章很少是正好对症的,折腾半天终于解决了,但是没有记录过程,结果下次碰到又要从来一次.有的问题还极其不好找,or ...