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跑得慢,一点办法也没有, ...
随机推荐
- 表单相关标签之textarea,select
textarea <textarea rows="3" cols="20"> 在w3school,你可以找到你所需要的所有的网站建设教程. < ...
- java json 转换
1.直接输出: 2.字符串 通过eval转换输出,里面涉及到一个转义问题,还要注意eval的用法里面需要加"("+ + ")" 3.
- vue 学习笔记—路由篇
一.关于三种路由 动态路由 就是path:good/:ops 这种 用 $route.params接收 <router-link>是用来跳转 <router-view> ...
- 快速搭建ELK日志分析系统
一.ELK搭建篇 官网地址:https://www.elastic.co/cn/ 官网权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/ ...
- 动态规划 - 198. House Robber
URL : https://leetcode.com/problems/house-robber/ You are a professional robber planning to rob hous ...
- 【ARTS】01_18_左耳听风-20190311~20190317
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- strstr()函数的使用
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. 实例: /** *Descriptio ...
- struts2框架之重复提交问题
防止重复提交 1. 什么是重复提交 * 提交表单时,点击一次后,页面没有刷新时,马上又点击一次,就是重复提交 * 提交后,通过浏览器的回退,又回到了表单页面,再次提交 * 提交后,按F5刷新,也是重复 ...
- 几种 WebP 动态图制作方法
1.RealWorld Paint 目前唯一有图形用户界面的 动态 webp 编辑器, 利用最新版本 libwebp v1.0.0 生成的有损动态图是打不开.这个有两个版本, 推荐使用 2013.1, ...
- oracle:10g下载地址(转载)
转载地址:http://www.veryhuo.com/a/view/177074.html Oracle 10g Database和Client多平台官方下载地址 http://www.veryhu ...