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跑得慢,一点办法也没有, ...
随机推荐
- bae64编码
data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJb ...
- 【转载】java abstract class和interface的区别
转载:https://blog.csdn.net/b271737818/article/details/3950245 在Java语言中,abstract class和interface是支持抽象类定 ...
- kotlin中“==”和“===”的区别
code 1 fun main(args: Array<String>) { val a : Int = 1000 println(a == a) //true println(a === ...
- renren-security旧版本 分模块 的模块之间关系浅析
Maven结构,一个父模块 六个子模块 七个pom.xml: \git\renren-security\pom.xml <modules> <module>renren-com ...
- Tip:什么是JavaBean
可视化JavaBean 非可视化JavaBean(分:值JavaBean和工具JavaBean) JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参 ...
- CAN总线芯片SN65HVD230QD介绍
CAN总线硬件电路如上,采用芯片为SN65HVD230QD,从TI获得的芯片手册,可知该芯片参数为: 3.3V供电 低电流为370uA典型值
- Linux内存分配小结--malloc、brk、mmap【转】
转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...
- 高并发的socket的高性能设计【转】
转自:https://blog.csdn.net/quincyfang/article/details/44654351 高性能数据传输系统的框架设计 1 引言 随着互联网和物联网的高速发展,使用网络 ...
- MySQL报错InnoDB: A long semaphore wait【转】
mysql登录后无法执行命令如show processlist 查看MySQL错误日志 参考以下方法,执行 1.系统层面 [root@pisphkdcbsql01 ~]# cat /proc/sys/ ...
- 使用javascript调用com组件
<html> <head> <title> 调用com组件的方法示例 </title> <script language="javasc ...