4. Sramoc问题 RE90求条,給解决方案

题目描述

Sramoc ( K , M ) 表示用数字0、1、2…、K-1组成(数位拼接)的正整数中能被M整除的最小数。给定 K、M,求Sramoc ( K,M )。例如 K=2,M=7的时候,Sramoc( 2 , 7 ) = 1001。

输入格式:

第一行为两个整数K、M满足2≤K≤10、k≤M≤1000。

输出格式:

输出Sramoc(K,M)

样例输入:

2 7

样例输出:

1001

数据范围:

2≤K≤10、1≤M≤1000。

时间限制:

1000

空间限制:

65536

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string S(ll k,ll m){
    unordered_set<string> v;
    queue<pair<ll,string>> q;
    q.push({0,"0"});
    while(!q.empty()){
        auto [num,s]=q.front();
        q.pop();
        for(ll i=0;i<k;i++){
            ll tn=num*10+i;
            string ns=s+to_string(i);
            if(tn%m==0 && tn!=0)return ns;
            if(v.find(ns)==v.end()){
                v.insert(ns);
                q.push({tn,ns});
            }
        }
    }
    
}
int main(){
    ll k,m;
    cin>>k>>m;
    string ans=S(k,m);
    bool flg=false;
    for(ll i=0;i<ans.size();i++){
      if(ans[i]!='0')flg=true;
      if(flg)cout<<ans[i];
    }
    return 0;
}

給解決方案,在线等大佬

#include<bits/stdc++.h>
using namespace std;
int k,m;
bool b[10010];
struct syzs{
    int mod,val,fro;//a[i].mod表示编号为i的S数除以m的余数,a[i].val表示编号为i的S数的个位数,a[i].fro表示上一个数的编号,存储fro和val方便递归输出结果
}a[10010];
inline void out(int x){//递归输出答案:不断找到上一个编号,输出其存储的值 
    if(!x) return;
    out(a[x].fro);
    if(a[x].fro)/*防止输出时出现首位0*/ printf("%d",a[x].val);
}
int main(){
    scanf("%d%d",&k,&m);
    int r=1;
    int h=1;
    while(r<=h){
        for(int i=0;i<k;i++) if(!b[((a[r].mod*10)%m+i)%m]/*判断之前又没有搜过相同的余数*/&&(r!=1||h!=1||i)/*判断是不是首位,如果是,则跳过0*/){
            int now=((a[r].mod*10)%m+i)%m;
            h++;
            a[h].mod=now;
            b[now]=1;
            a[h].val=i;
            a[h].fro=r;//更新,将新节点加入队列 
            if(!(a[h].mod%m)){
                out(h);//输出 
                return 0;//找到答案即结束 
            }
        }
		r++;
    }
    return 0;
}

求大佬指出我的代码那里有问题

你这我有点看不出来,我不是用栈写的,而且我不是大佬

你这个是哪一课的,我在洛谷写的

线上班
图灵普及三综合训练上午

嘶,没报图灵班呢