//用BigInteger做的,事实证明这个方法虽然能解决,但比较麻烦 //思路应该是这样的,比如给一个5302134,应该先去一个1234,即成为530,然后将53排在最前,中间试着放1234的排列,使能整除7,然后最后放0 #define sprintf_s sprintf//gcc?????? const int base = 10; //10????? /*const int width = 4; //???????4*/ const int N = 1000; //N?int??,N*width??????????? #include <iostream> #include <vector> #include <string> using namespace std; int mo[7]={4123,1324,1234,2341,1243,3421,3142}; struct bigint { int ln; int v[N]; bigint(int r = 0) { for (ln = 0; r > 0; r /= base) v[ln++] = r % base; } bigint & operator =(const bigint & r) { memcpy(this, &r, (r.ln + 1) * sizeof(int)); return *this; } }; bool operator <(const bigint & a, const bigint & b) { int i; if (a.ln != b.ln) return a.ln < b.ln; for (i = a.ln - 1; i >= 0 && a.v[i] == b.v[i]; i--); return i < 0 ? 0 : a.v[i] < b.v[i]; } bool operator <=(const bigint & a, const bigint & b) { return !(b < a); } bigint operator +(const bigint & a, const bigint & b) { bigint res; int i, cy = 0; for (i = 0; i < a.ln || i < b.ln || cy > 0; i++) { if (i < a.ln) cy += a.v[i]; if (i < b.ln) cy += b.v[i]; res.v[i] = cy % base; cy /= base; } res.ln = i; return res; } bigint operator -(const bigint & a, const bigint & b) { bigint res; int i, cy = 0; for (res.ln = a.ln, i = 0; i < res.ln; i++) { res.v[i] = a.v[i] - cy; if (i < b.ln)res.v[i] -= b.v[i]; if (res.v[i] < 0)cy = 1, res.v[i] += base; else cy = 0; } while (res.ln > 0 && res.v[res.ln - 1] == 0) res.ln--; return res; } bigint operator *(const bigint & a, const bigint & b) { bigint res; res.ln = 0; if (0 == b.ln) { res.v[0] = 0; return res; } int i, j, cy; for (i = 0; i < a.ln; i++) { for (j = cy = 0; j < b.ln || cy > 0; j++, cy /= base) { if (j < b.ln) cy += a.v[i] * b.v[j]; if (i + j < res.ln) cy += res.v[i + j]; if (i + j >= res.ln) res.v[res.ln++] = cy % base; else res.v[i + j] = cy % base; } } return res; } bigint operator /(const bigint & a, const bigint & b) { bigint mod, res; int i, lf, rg, mid; mod.v[0] = mod.ln = 0; for (i = a.ln - 1; i >= 0; i--) { mod = mod * base + a.v[i]; for (lf = 0, rg = base - 1; lf < rg;) { mid = (lf + rg + 1) / 2; if (b * mid <= mod) lf = mid; else rg = mid - 1; } res.v[i] = lf; mod = mod - b * lf; } res.ln = a.ln; while (res.ln > 0 && res.v[res.ln - 1] == 0) res.ln--; return res; } bigint operator %(const bigint &a,const bigint &b) { bigint tmp=a/b,res; res=a-tmp*b; return res; } int digits(bigint & a) { if (a.ln == 0) return 0; int l = (a.ln - 1) * 4; for (int t = a.v[a.ln - 1]; t; ++l, t /= 10); return l; } void read(bigint & b, const string buf) { int w, u, ln = (int)buf.size(); memset(&b, 0, sizeof(bigint)); int i=0; while('0'==buf[i]&&i<ln) i++; if (i==ln) { b=(bigint)0; } else { for (w = 1, u = 0; ln > i;) { u += (buf[--ln] - '0') * w; if (w * 10 == base) {b.v[b.ln++] = u;u = 0;w = 1;} else w *= 10; } if (w != 1)b.v[b.ln++] = u; } } void write(const bigint & a,string& buf) { int i; char tmp[5]; sprintf_s(tmp,"%d", a.ln == 0 ? 0 : a.v[a.ln - 1]); buf+=tmp; for (i = a.ln - 2; i >= 0; i--) { sprintf_s(tmp,"%d", a.v[i]); buf+=tmp; } } int main() { int n,i,j,k; int s[10]; cin>>n; for (i=0;i<n;i++) { for (k=0;k<10;k++) s[k] =0; bigint num; string res; cin>>res; read(num,res); // scanf("%I64d",&num); while (!(num<1)) { s[num.v[0]%10]++; num= num/10; } for (j=1;j<=4;j++) s[j]--; //组装起数来 for (j=9;j>=1;j--) { for (k=1;k<=s[j];k++) { num=num*10+j; } } for (k=0;k<7;k++) { if ((num*10000+mo[k])%7<1) { num = num*10000+mo[k]; for(j=1;j<=s[0];j++) num = num*10; string tmp; write(num,tmp); cout<<tmp<<endl; break; } } } return 0; }