Я пытаюсь решить проблему здесь, используя BFS и сохраняя остаток и обновляя его. Тем не менее, я получаю TLE при этом, как я могу его устранить?
int t,n,i,j,z,y;
string l,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
pair<string,int>b;
queue<pair<string,int> >a;
b=make_pair("1",1);
a.push(b);
bool r[20001]={0};
while(!a.empty())
{
b=a.front();
a.pop();
// cout<<b.first<<endl;
if(b.second%n==0)
{
printf("%s\n",b.first.c_str());
break;
}
m=b.first;
y=b.second;
z=(y*10)%n;
if(r[z]==0)
{ r[z]=1;
l=m+'0';
b=make_pair(l,z);
a.push(b);
}
z=(y*10+1)%n;
if(r[z]==0)
{ r[z]=1;
l=m+'1';
b=make_pair(l,z);
a.push(b);
}
}
}
Подумайте об этом по-другому. У вас есть a_i = (10^i) % n
, и вы хотели бы найти такое b_i = 0..1
что sum(a_i * b_i, i) % n = 0
. Похоже, это задача динамического программирования.
У вас есть массив m
где m[i][j] = true
означает "Я могу представить число k
нулей и единиц, таких, что k % n == j
, и для этого нам нужно не больше i
цифр".
В вашей формуле DP у вас есть m[i+1][j] = m[i+1][(j + 10^i) % n] = true
когда m[i][j] = true
.
Чтобы показать это число, вам нужно отступить от вашего m
от m[somewhere][0] = true
.
Перед отправкой проверьте свое решение на все возможные n
, так как их довольно мало (всего 20000). Я думаю, вы могли бы даже предварительно создать все решения и написать решение для поиска массива.