Code FeatUVA - 11754

题意:给出c个彼此互质的xi,对于每个xi,给出ki个yj,问前s个ans满足ans%xi的结果在yj中有出现过。

一看便是个中国剩余定理,但是同余方程组就有ki的乘积种组合,而ki的乘积最大是1e18,直接中国剩余定理肯定不是的,只能对ki的乘积稍微小的时候才能使用。

而当ki的乘积很大时,便说明对于每个xi它的yj都很多,那么我们挑选其中一组xi,设ans=temp*xi+yj,temp不需要枚举到很大便能满足其他的%xi=yj,

至于那组xi的选择,因为我们是要枚举得更快,所有便是yj尽可能的多,xi尽可能的大,也就是ki/xi最小。

最后注意输出格式上,空行的输出。

 #include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
const int N=;
int n,m;
ll bb[N],cc[N],cp;
set<ll> ss[N];
ll exgcd(ll a,ll b, ll &x,ll &y){
if(!b){
x=;
y=;
return a;
}
ll g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
ll inv(ll a,ll c){
ll g,x,y;
g=exgcd(a,c,x,y);
return g== ? (x%c+c)%c : -;
}
ll crt(){
ll ans=,temp;
for(int i=;i<n;i++){
temp=cp/cc[i];
ans+=bb[i]*temp*inv(temp,cc[i]);
if(ans>=cp) ans%=cp;
}
ans=(ans+cp)%cp;
if(!ans) ans+=cp;
return ans;
}
void dfs(int x){
if(x==n){
ss[n].insert(crt());
return ;
}
for(set<ll>::iterator it=ss[x].begin();it!=ss[x].end();it++){
bb[x]=*it;
dfs(x+);
}
}
void solve1(){
cp=;
for(int i=;i<n;i++) cp*=cc[i];
ss[n].clear();
dfs();
ll temp=,ans;
while(m){
for(set<ll>::iterator it=ss[n].begin();it!=ss[n].end();it++){
ans=(*it)+temp*cp;
printf("%lld\n",ans);
m--;
if(!m) break;
}
temp++;
}
}
void solve2(int p){
ll temp=,ans;
while(m){
for(set<ll>::iterator it=ss[p].begin();it!=ss[p].end();it++){
ans=temp*cc[p]+(*it);
if(!ans) continue;
bool flag=true;
for(int i=;i<n;i++){
if(i==p) continue;
if(ss[i].find(ans%cc[i])==ss[i].end()){
flag=false;
break;
}
}
if(flag){
printf("%lld\n",ans);
m--;
}
if(!m) break;
}
temp++;
}
}
int main(){
int k,p;
ll ji,x;
int t=;
while(~scanf("%d%d",&n,&m)){
if(t) printf("\n");
t=;
p=-;ji=;
for(int i=;i<n;i++){
ss[i].clear();
scanf("%lld",&cc[i]);
scanf("%d",&k);
ji*=k;
if(p==-||k*cc[p]<(int)ss[p].size()*cc[i]) p=i;
while(k--){
scanf("%lld",&x);
ss[i].insert(x);
}
}
if(ji<=) solve1();
else solve2(p);
}
return ;
}

巧妙的分类解决

最新文章

  1. front-end plugin, generate pdf with html5 and jquery
  2. 深入理解CSS绝对定位
  3. JavaScript星形评分
  4. Linux Hugepage ,AMM及 USE_LARGE_PAGES for oracle 11G(转载)
  5. 如何写出好的Java代码?
  6. css控制UL LI 的样式详解
  7. 在JS中得到表单中各项的值
  8. 使用ILmerge合并Exe、Dll文件的帮助类
  9. Error:&quot;Java patch PatchPasswordEncryption_J10001 is being applied by some other process&quot; when starting Ranger Admin
  10. 在SSL / https下托管SignalR
  11. selenium笔记(1)
  12. CSS矩形、三角形等
  13. Python内置函数(25)——getattr
  14. webpack中插件 prerender-spa-plugin 来进行SEO优化(二十四)
  15. PostgreSQL自学笔记:5 数据类型和运算符
  16. 各机器学习方法代码(OpenCV2)
  17. 如何控制docker的CPU和内存份额
  18. 【作业】用栈模拟dfs
  19. Linux 安装 iptables防火墙
  20. Oracle EBS INV更新保留

热门文章

  1. 【Transact-SQL】计算整个表中所有值的出现的次数
  2. JS OOP -03 JS类的实现
  3. 在.netcore webapi项目中使用后台任务工具Hangfire
  4. mysql 2 修改表
  5. Unity 宽度适配 NGUI
  6. js写guess网页
  7. iOS 超级签名详解
  8. ffmpeg 命令的使用
  9. 安卓已过时的ProgressDialog对话框
  10. 不常见的sql错误处理方法(1)