破防了,为什么随意地点开一道uva都是紫的?
WA。代码如下。
#include <bits/stdc++.h>
using namespace std;
int c,s;
int x[75],xp,y[75][101];
int co[75];
void exgcd(int a,int b,int &x,int &y){
if(b==0) x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
vector<int> ans,rans;
void dfs(int dep){
if(dep==c+1){
int res=0;
for(int i=1;i<=c;++i){
int xi=xp/x[i],p,q;
exgcd(xi,x[i],p,q);
res=((res+co[i]*xi*p)%xp+xp)%xp;
}
if((xp+res)%xp!=0) ans.push_back((res+xp)%xp);
return;
}
for(int i=1;i<=y[dep][0];++i){
co[dep]=y[dep][i];
dfs(dep+1);
}
}
void solve(){
int kp=1;
xp=1;
for(int i=1;i<=c;++i){
cin>>x[i]>>y[i][0];
xp*=x[i];
for(int j=1;j<=y[i][0];++j) cin>>y[i][j];
kp*=y[i][0];
}
if(kp<=1e4){
int _=0;
ans.clear();
dfs(1);
sort(ans.begin(),ans.end());
for(int i=0;i<s;++i) ans.emplace_back(ans[i]+xp);
for(int i=0;i<s;++i) cout<<ans[i]<<endl;
cout<<endl;
}else{
double mkmx=(double)y[1][0]/(double)x[1];
int p=1;
vector<int> fin;
for(int i=2;i<=c;++i) if((double)y[i][0]/(double)x[i]<mkmx){
mkmx=(double)y[i][0]/(double)x[i];
p=i;
}
for(int t=0;fin.size()<s;++t) for(int i=1;i<=y[p][0]&&fin.size()<s;++i){
int ans=t*x[p]+y[p][i];
if(ans==0) continue;
bool fnd=true;
for(int j=1;j<=c;++j){
if(j==p) continue;
int nh=ans%x[j];
bool ok=false;
for(int k=1;k<=y[j][0];++k) if(nh==y[j][k]){
ok=true;
break;
}
if(!ok){
fnd=false;
break;
}
}
if(fnd) fin.push_back(ans);
}
for(int ie:fin) cout<<ie<<endl;
cout<<endl;
}
}
int main(){
while(cin>>c>>s&&c&&s) solve();
return 0;
}