代码求条
  • 板块UVA11754 Code Feat
  • 楼主Alea
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/10 21:01
  • 上次更新2024/8/10 22:07:26
查看原帖
代码求条
322792
Alea楼主2024/8/10 21:01

破防了,为什么随意地点开一道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;
}
2024/8/10 21:01
加载中...