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; }