USACO-2.2 Runaround Numbers(列挙)

1636 ワード

テーマリンク:http://train.usaco.org/usacoprob2?a=SceFaavqnaPI&S=runround
/*
ID: 1590291
TASK: runround
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;
/****************************************************************************************************************
              :      ,             。       
              :
            1,    ,      
            2,           1~9        ,    0!!!               
****************************************************************************************************************/
int sign[20],cont[20];
int fuc(long x)
{
    memset(sign,0,sizeof(sign));
    memset(cont,0,sizeof(cont));

    int le=(int)log10(x)+1;  //k   
    int num=0;

    if(le == 1) return 0;
    for(int i = le-1;i >= 0;i -- , x/=10)
        sign[i]=x%10;

    for(int i = 0;i < le;i ++)
        cont[sign[i]]++;
    for(int i = 0;i < le;i ++)
        if(cont[i] > 1)
            return 0;

    memset(cont,0,sizeof(cont));
    int id=0;
    for(int i = 0;i < le;i ++){
        cont[sign[id]]++;
        if(cont[sign[id]] > 1)
            return 0;
        id=(id+sign[id])%le;
    }
    if(id != 0) return 0;       //       ,       0,       ~
    return 1;
}

int main()
{
    ifstream fin("runround.in");
    ofstream fout("runround.out");

    unsigned long n;
    while(fin>>n)
    {
        for(long i = n+1; ;i ++){
            if(fuc(i)){
                fout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}