HDU 4474 Yet Another Multiple Problem ( BFS + 同余剪枝 )
没什么巧办法,直接搜就行。
用余数作为每个节点的哈希值。
#include <cstdio> #include <cstring> #include <cstdlib> const int MAXN = 10100; struct node { int mod; int fa; int digit; node() {} node( int mod, int fa, int dig ):mod(mod), fa(fa), digit(dig) { } }; int N; bool ok[12]; bool vis[MAXN]; node Q[MAXN << 2]; void findFa( int u ) { if ( u == -1 ) return; findFa( Q[u].fa ); printf( "%d", Q[u].digit ); } int BFS() { int head = 0; int tail = 0; memset( vis, false, sizeof(vis) ); for ( int i = 1; i < 10; ++i ) { if ( !ok[i] ) continue; int hashh = i % N; if ( vis[hashh] ) continue; vis[hashh] = true; Q[tail] = node( hashh, -1, i ); if ( hashh == 0 ) return tail; ++tail; } while ( head < tail ) { node cur = Q[head]; for ( int i = 0; i < 10; ++i ) { if ( !ok[i] ) continue; int hashh = ( cur.mod * 10 + i ) % N; if ( vis[hashh] ) continue; vis[hashh] = true; Q[tail] = node( hashh, head, i ); if ( hashh == 0 ) return tail; ++tail; } ++head; } return -1; } int main() { int cas = 0; while ( scanf( "%d", &N ) == 1 ) { memset( ok, true, sizeof(ok) ); int n; scanf( "%d", &n ); for ( int i = 0; i < n; ++i ) { int digit; scanf( "%d", &digit ); ok[digit] = false; } printf( "Case %d: ", ++cas ); int ans = BFS(); if ( ans != -1 ) findFa( ans ); else printf("-1"); puts(""); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步