题目链接:Runaround Numbers
因为每个数都不相同,所以可以枚举出所有的数,复杂度是
9!
。
排序后可以二分找答案。
/*
ID: xdujlx1
PROG: runround
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll arr[100007];
int a[11];
bool vis[11];
int k;
void ioinit()
{
freopen("runround.in","r",stdin);
freopen("runround.out","w",stdout);
}
void check(int *a, int n)
{
int cnt=0;
memset(vis,0,sizeof(vis));
int pos=0;
while(!vis[pos])
{
vis[pos]=true;
cnt++;
pos=(pos+a[pos])%n;
}
if(cnt==n&&pos==0)
{
ll res=0;
for(int i=0;i<n;i++)
{
res*=10;
res+=a[i];
}
arr[k++]=res;
}
}
bool used[11];
void creat(int pos, int val)
{
if(!val)
{
check(a,pos);
return;
}
else
{
a[pos]=val;
check(a,pos+1);
}
for(int i=1;i<10;i++)
if(!used[i]) used[i]=true,creat(pos+1,i),used[i]=false;
}
int main()
{
ioinit();
for(int i=1;i<10;i++) used[i]=true,creat(0,i),used[i]=false;
//for(int i=0;i<k;i++) cout << arr[i] << endl;
sort(arr,arr+k);
int n;
scanf("%d",&n);
int t=upper_bound(arr,arr+k,n)-arr;
cout << arr[t] << endl;
return 0;
}