UVa10624 - Super Number

题目大意

给定两个数n和m,如果长度为m的数满足对于每个i(n<=i<=m),数字的前i位都能被i整除,那么这个数就是超级数,求出字典序最小的符合要求的超级数。

题解

直接暴力就行,如果每次进行整除判断的时候,对当前数每位都进行取余运算,那么将会超时,因此每18位进行一次取余(long long的数据范围为:-9223372036854775808..9223372036854775807,这样在1S左右就可以AC了。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int n,m;
int  s[35];
int check(int step)
{
     long long t;
    int i,len;
    t=0;
    len=0;
    for(i=0; i<step; i++)
    {
        t=t*10+s[i];
        len++;
        if(len==18)
        {
            len=0;
            t%=step;
        }
    }
    return t%step;
}
int dfs(int step )
{
    int i,k;
    if(step>m)
        return 1;
    if(step==1) k=1;
    else
        k=0;
    for(i=k; i<10; i++)
    {
        s[step-1]=i;
        if(step>=n&&check(step))continue;
        if (dfs(step+1)) return 1;
    }
    return 0;
}
int main(void)
{
    int T,flag,p=0,i;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        cout<<"Case "<<++p<<": ";
        flag=dfs(1);
        if(flag)
        {
            for(i=0;i<m;i++)
            cout<<s[i];
            cout<<endl;
        }
        else
        cout<<"-1"<<endl;
}
    return 0;
}

 

 

 

 

posted on 2013-04-15 13:23  仗剑奔走天涯  阅读(151)  评论(0编辑  收藏  举报

导航