假設a,aa,aaa……一直下去,對n取模,一定會出現循環,也就是會有aaaa…aaa和aaa…aa對n取模相同,那麼把他們相減得到aaaa…0000,則只出現了2個數字得到了n的倍數。這種方法雖然不是最優,但保證了不同的數不會超過2種,所以可以直接搜索。
枚舉所有組合(首先枚舉只出現1種數字,再枚舉出現2種的),然後搜索就夠了,判重時用余數判重。
注意得到答案後要進行字典序比較。
此題不用把字符串保存在隊列中,直接維護父親節點的路徑和信息,然後最後一次遞歸取出。
#include#include #include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f #define M 10001 int fa[M],pa[M],vis[M]; char s[M]; int top; int anstop; char ans[M]; char tmp[M]; int n,m; void print(int k) { if(k==0) return; print(fa[k]); s[top++]=pa[k]; } void cmp() { if(anstop top) { for(int i=0;i s[i]) { for(int j=i;j Q; bool bfs(int k1,int k2) { top=0; if(k1+k2==0) return false; while(!Q.empty()) Q.pop(); memset(vis,0,sizeof(vis)); fa[0]=-1; Q.push(0); while(!Q.empty()) { int t=Q.front();Q.pop(); if(t||k1){ int f=(t*m+k1)%n; if(!vis[f]) { vis[f]=1; fa[f]=t; pa[f]=k1+'0'; if(f==0) { print(fa[f]); s[top++]=pa[f]; if(anstop==0) {anstop=top;for(int i=0;i