Solution
- 以预处理出来所有合法的数,用链表保存,每次询问答案就是O(1)的。
- 预处理的时候可以先把带七的无重复的找出来,具体来说最大为为i的含有七的数字一定由第i位为7的所有数字和前i-1位含有7的所有数字在第i位拼任意数组成,然后根据这些晒掉所有倍数。
Code
#include<iostream>
#include<cstdio>
using namespace std;
bool isok[10000005];
int sevens[10000005],cnt,nx[10000005];
void shai()
{
sevens[++cnt]=7;
int pw = 10;
for(int i=1;i<=6;i++)
{
int cnt0 = cnt;
for(int j=1;j<=9;j++)
{
if(j!=7)
{
for(int k=1;k<=cnt0;k++)
sevens[++cnt]=pw*j+sevens[k];
}
}
for(int j=1;j<pw;j++)
sevens[++cnt]=7*pw+j;
pw*=10;
}
}
int t,x;
int main()
{
shai();
for(int i=1;i<=cnt;i++)
{
int k = sevens[i];
isok[k] = 1;
for(int j=2;k*j<=10000000;j++)
isok[k*j] = j;
}
int last = 1;
for(int i=1;i<=10000000;i++)
{
if(!isok[i])
{
nx[last] = i;
last = i;
}
}
nx[last] = 1e7+1;
cin>>t;
while(t--)
{
int ans = 0;
scanf("%d",&x);
if(isok[x])
cout<<-1<<endl;
else{
ans = nx[x];
cout<<ans<<endl;
}
}
return 0;
}