Hướng dẫn giải của Lucky Numbers
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
var t,i:byte; n:longint; s,s1:string; j,k,q,dd:byte; kt:boolean; function divide(s:string;l,l1:byte):boolean; var code:integer; du,x:longint; st:string; i,t:byte; begin t:=l mod 4; if t=0 then t:=4; st:=copy(s,1,t); val(st,du,code); du:=du mod n; for i:=1 to (l-t) div 4 do begin st:=copy(s,t+i*4-3,4); val(st,x,code); du:=(du*10000+x) mod n; end; divide:=(du=0); end; begin readln(t); for i:=1 to t do begin readln(n); if n mod 5 = 0 then begin writeln(-1); continue; end; kt:=false; str(n,s1); dd:=length(s1); for j:=dd to 200 do begin for k:=0 to j do begin s:=''; for q:=1 to k do s:=s+'8'; for q:=k+1 to j do s:=s+'6'; if divide(s,j,dd) then begin writeln(s); kt:=true; break; end; end; if kt then break; end; end; end.
Code mẫu của happyboy99x
#include<cstdio> int pow10[201]; void testcase() { int x; scanf("%d", &x); x *= 9; pow10[0] = 1; for(int i = 1; i <= 200; ++i) pow10[i] = pow10[i-1] * 10 % x; for(int nd = 1; nd <= 200; ++nd) for(int n8 = 0; n8 <= nd; ++n8) if((8*pow10[nd] - 2*pow10[nd-n8] - 6) % x == 0) { for(int i = 0; i < n8; ++i) printf("8"); for(int i = 0; i < nd - n8; ++i) printf("6"); printf("\n"); return; } printf("-1\n"); } int main() { int tc; scanf("%d", &tc); while(tc--) testcase(); return 0; }
Code mẫu của ladpro98
program luckynum; uses math; const fi=''; fo=''; type bigNum = String; var xau:array[0..20400] of string; so6,so8:array[0..201] of string; inp,oup:text; t,n,i:longint; sochia:array[1..21] of longint; function bigmod(a:bignum;b:longint):longint; var i,hold:longint; begin hold:=0; for i:=1 to length(a) do hold:=(ord(a[i])-48+hold*10) mod b; exit(hold); end; procedure init; var s:string; i,j:longint; begin s:=''; so6[0]:=''; for i:=1 to 200 do begin s:=s+'6'; so6[i]:=s; end; s:=''; so8[0]:=''; for i:=1 to 200 do begin s:=s+'8'; so8[i]:=s; end; t:=1; for i:=1 to 200 do begin for j:=0 to i do begin xau[t]:=concat(so8[j],so6[i-j]); inc(t); end; end; end; function process(x:longint):bignum; var i:longint; begin if (x mod 5) = 0 then exit('-1'); for i:=1 to t-1 do begin if (bigmod(xau[i],x) = 0) then exit(xau[i]); end; exit('-1'); end; procedure input; var i:longint; begin assign(inp,fi); reset(inp); assign(oup,fo); rewrite(oup); readln(inp,n); for i:=1 to n do begin readln(inp,sochia[i]); end; for i:=1 to n do begin writeln(oup,process(sochia[i])); end; close(inp); close(oup); end; begin init; input; end.
Code mẫu của RR
{$R+,Q+} uses math; const FINP=''; FOUT=''; MAXN=201; lt10:array[0..3] of longint=(1,10,100,1000); type big=array[0..51] of longint; var n,test,t,best,s8,s6:longint; a:array[1..MAXN] of longint; b:big; f1,f2:text; procedure openF; inline; begin assign(f1,FINP); reset(f1); assign(f2,FOUT); rewrite(f2); end; procedure closeF; inline; begin close(f1); close(f2); end; procedure ans; inline; var i:longint; begin if best=MAXN then begin writeln(f2,-1); exit; end; for i:=1 to s8 do write(f2,8); for i:=1 to s6 do write(f2,6); writeln(f2); end; procedure inp; inline; begin readln(f1,n); end; procedure trans(l:longint; var b:big); inline; var i,now:longint; begin fillchar(b,sizeof(b),0); b[0]:=1; now:=0; for i:=l downto 1 do begin b[b[0]]:=b[b[0]]+a[i]*lt10[now]; inc(now); if now=4 then begin now:=0; inc(b[0]); end; end; while (b[0]>0) and (b[b[0]]=0) do dec(b[0]); end; //Chia lay phan du operator / (b:big; k:longint) c:longint; var i,nho:longint; begin nho:=0; for i:=b[0] downto 1 do nho:=(b[i]+nho*10000) mod k; c:=nho; end; procedure solve; var i,j,ii:longint; begin best:=MAXN; for i:=0 to MAXN-1 do for j:=0 to MAXN-1 do if (i>0) or (j>0) then begin if i+j>=best then continue; fillchar(a,sizeof(a),0); for ii:=1 to i do a[ii]:=8; for ii:=i+1 to i+j do a[ii]:=6; trans(i+j,b); if b/n=0 then begin best:=i+j; s8:=i; s6:=j; end; end; end; begin openF; read(f1,t); for test:=1 to t do begin inp; solve; ans; end; closeF; end.
Code mẫu của hieult
#include <stdio.h> main() { int n,a[20],t[20],n8[20],n6[20]; long b[20][201],c[20][201]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) { t[i]=0; b[i][0]=0; c[i][0]=0; b[i][1]=1; c[i][1]=1; for(int j=2;j<=200;j++) { b[i][j]=b[i][j-1]*10%a[i]; c[i][j]=(c[i][j-1]*10+1)%a[i]; } for(int j=1;j<=200;j++) { for(int k=0;k<=j;k++) if((8*b[i][j-k+1]*c[i][k]+6*c[i][j-k])%a[i]==0) { n8[i]=k; n6[i]=j-k; t[i]=1; break; } if(t[i]==1) break; } } for(int i=0;i<n;i++) { if(t[i]==0) printf("-1\n"); else { for(int j=0;j<n8[i];j++) printf("8"); for(int j=0;j<n6[i];j++) printf("6"); printf("\n"); } } }
Code mẫu của ll931110
{$MODE DELPHI} Program LUCKYNUM; Const input = ''; output = ''; maxn = 10000; maxk = 200; Var fi,fo: text; d6,d8: array[0..maxn] of integer; n,i,t: integer; Procedure openfile; Begin Assign(fi, input); Reset(fi); Assign(fo, output); Rewrite(fo); End; Procedure solve; Var st,res,tmp,curr: integer; e6,e8,i,k: integer; Begin res:= maxn; Fillchar(d8, sizeof(d8), 0); st:= 0; tmp:= st; Repeat Fillchar(d6, sizeof(d6), 0); d6[tmp]:= d8[tmp]; If tmp = 0 then If (res > d8[tmp]) and (d8[tmp] <> 0) then Begin res:= d8[tmp]; e6:= 0; e8:= d8[tmp]; End; curr:= tmp; Repeat k:= (curr * 10 + 6) mod n; If d6[k] = 0 then d6[k]:= d6[curr] + 1 else break; curr:= k; Until false; If (d6[0] < res) and (d6[0] <> 0) then Begin res:= d6[0]; e8:= d8[tmp]; e6:= d6[0] - e8; End; tmp:= (st * 10 + 8) mod n; If d8[tmp] = 0 then d8[tmp]:= d8[st] + 1 else break; If d8[tmp] > res then break; st:= tmp; Until false; If res > maxk then writeln(fo, -1) else Begin For i:= 1 to e8 do write(fo, 8); For i:= 1 to e6 do write(fo, 6); Writeln(fo); End; End; Procedure closefile; Begin Close(fo); Close(fi); End; Begin openfile; Readln(fi, t); For i:= 1 to t do Begin Readln(fi, n); solve; End; closefile; End.
Code mẫu của skyvn97
#include<stdio.h> #define MAX 222 int x; int mod[MAX]; int m10[MAX]; int im,jm; int t,c; void process(void) { scanf("%d",&x); int i,j; mod[0]=0; m10[0]=1; for (i=1;i<=211;i=i+1) { mod[i]=(mod[i-1]*10+1)%x; m10[i]=(m10[i-1]*10)%x; } im=211; jm=211; for (i=0;i<=200;i=i+1) for (j=0;i+j<=200;j=j+1) { if (i+j==0) continue; if ((8*mod[i]*m10[j]+6*mod[j])%x!=0) continue; if (i+j>im+jm) continue; if (i+j==im+jm) if (i<im) { im=i; jm=j; continue; } if (i+j<im+jm) { im=i; jm=j; } } if (im+jm>200) { printf("-1\n"); return; } for (i=1;i<=im;i=i+1) printf("8"); for (i=1;i<=jm;i=i+1) printf("6"); printf("\n"); } int main(void) { scanf("%d",&t); for (c=1;c<=t;c=c+1) process(); }
Bình luận