69,370
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
int Sramoc(int k,int m){
int l,rlt;
int r[6]={0,0,0,0,0,0};
while(1){
for(l=0;l<6;l++){
if(++r[l]<k) break;
r[l]=0;
}
rlt=r[0]+r[1]*1e1+r[2]*1e2+r[3]*1e3+r[4]*1e4+r[5]*1e5;
if(rlt%m==0) return rlt;
}
return -1;
}
void main(){
int k,m;
scanf("%d %d",&k,&m);
printf("%d",Sramoc(k,m));
}
因为不确定位数,所以最好用广搜。另外,为了避免诸如超空间、超时之类的问题,有如下处理方法:
1:队列维护三个值,最后一位的数字,当前的余数,还有就是其前趋。
2:开一个哈希表:hash[i][j]表示尾数为i,余数为j是否出现过。
这样就能极大地减小枚举量。因为这样做的话,如果尾数一样余数也一样,就等于做了无用功,重复入队了。这样就能极大地减少无效状态。
一旦出现第一个余数为0的,就直接输出,结束。
Code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int k,m;
struct point
{
int x,mod,f;
}q[5000000];
bool hash[10][1000];
void dfs(int x)
{
if (x==-1) return;
dfs(q[x].f);
printf("%d",q[x].x);
}
int main()
{
freopen("sramoc.in","r",stdin);
freopen("sramoc.out","w",stdout);
scanf("%d%d",&k,&m);
int l=0,r=0;
for (int i=1; i<k; i++)
{
q[r].x=i; q[r].f=-1; q[r++].mod=(i % m);
hash[i][(i % m)]=1;
if (!(i % m))
{
printf("%d\n",i);
fclose(stdin);
fclose(stdout);
exit(0);
}
}
while (l<r)
{
point tmp=q[l++];
for (int i=0; i<k; i++)
{
point now=tmp;
now.x=i; now.f=l-1; now.mod=(tmp.mod*10+i)%m;
if (!hash[now.x][now.mod])
{
q[r++]=now;
hash[now.x][now.mod]=1;
}
if (!now.mod)
{
dfs(r-1);
printf("\n");
fclose(stdin);
fclose(stdout);
exit(0);
}
}
}
return 0;
}