Hướng dẫn giải của Số thân thiện


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.

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 i,a,b,re:longint;

function gcd(x,y:longint):longint;
begin
        if (x=0) or (y=0) then gcd:=x+y
        else
                if x>y then gcd:=gcd(y,x mod y)
                else gcd:=gcd(x,y mod x);
end;

function check(x:longint):boolean;
var s:string; i,l:longint;  c:char;  code:integer;
begin
        str(x,s);
        l:=length(s);
        for i:=1 to l shr 1 do
        begin
              c:=s[i]; s[i]:=s[l-i+1]; s[l-i+1]:=c;
        end;
        val(s,l,code);
        check:=gcd(x,l)=1;
end;

begin
        read(a,b);
        for i:=a to b do
                if check(i) then inc(re);
        writeln(re);
end.

Code mẫu của happyboy99x

#include <cstdio>

int rev( int n ) {
    int res = 0;
    while(n) {
        res = res * 10 + n % 10;
        n /= 10;
    }
    return res;
}

int gcd( int a, int b ) {
    while(b) {
        int t = b;
        b = a % b;
        a = t;
    }
    return a;
}

int main() {
    int a, b; scanf( "%d%d", &a, &b );
    int count = 0;
    for( int i = a; i <= b; ++i ) if( gcd(i, rev(i)) == 1 ) ++count;
    printf( "%d\n", count );
    return 0;
}

Code mẫu của ladpro98

program nknumfre;
uses    math,SysUtils;
var     a,b:longint;
        dao:array[1..300001] of longint;
        count,i:longint;
procedure init;
var     i,j:longint;
        s,s2:string;
begin
        for i:=a to b do
        begin
                s2:='';
                str(i,s);
                for j:=length(s) downto 1 do s2:=s2+s[j];
                dao[i]:=StrToInt(s2);
        end;

end;

function gcd(a,b:longint):longint;
begin
        if a mod b = 0 then exit(b)
        else exit(gcd(b, a mod b));
end;

begin
        count:=0;
        readln(a,b);
        init;
        for i:=a to b do
        begin
                if gcd(i,dao[i]) = 1 then inc(count);
        end;
        writeln(count);
end.

Code mẫu của RR

var
  i,a,b,cnt:longint;

function gcd(a,b:longint):longint;
    begin
      if (a=0) or (b=0) then exit(a+b)
      else exit(gcd(b,a mod b));
    end;

function check(i:longint):boolean;
    var
      u,v:longint;
    begin
      u:=0; v:=i;
      while (i>0) do
        begin
          u:=u*10+i mod 10;
          i:=i div 10;
        end;
      exit(gcd(u,v)=1);
    end;

begin
  read(a,b);
  cnt:=0;
  for i:=a to b do
    if check(i) then inc(cnt);
  writeln(cnt);
end.

Code mẫu của hieult

#include <stdio.h>
#include <math.h>
main()
{
int a,b,t,m,N,N1,A[5],k=0;
scanf("%d %d",&a,&b);
for(int n=a;n<=b;n++)
  {
  N=n;
  N1=n;
  t=0;
  m=0;
  for(int i=0;i<5;i++)
    {
    if(N==0)
      break;
    else
      t++;
    A[i]=N%10;
    N=N/10;
    }
  for(int i=0;i<t;i++)
    m=m+A[i]*pow(10,(t-i-1));
  while(1)
    {
    if(m%N1==0)
      {
      if(N1==1)
        k++;
      break;
      }
    else
      m=m%N1;
    if(N1%m==0)
      {
      if(m==1)
        k++;
      break;
      }
    else
      N1=N1%m;
    }
  }
printf("%d",k);
}

Code mẫu của ll931110

Program NKNUMFRE;
        Const
                input  = '';
                output = '';
        Var
                F: array[1..5] of longint;
              a,b: longint;
                q: longint;

Procedure init;
          Var
                fi: text;
          Begin
                Assign(fi, input);
                        Reset(fi);
                        Readln(fi, a, b);
                Close(fi);
          End;

Function eculide(x,y: longint): longint;
         Begin
                   Repeat
                                If x > y then x:= x - y
                           else if x < y then y:= y - x;
                   Until x = y;

                   eculide:= x;
         End;

Procedure rev(p: longint);
          Var
                i,k: longint;
          Begin
                F[1]:= p;

                For i:= 1 to 4 do
                        Begin
                                F[i + 1]:= F[i] div 10;
                                F[i]:= F[i] mod 10;
                        End;

                q:= 0;

                k:= 5;
                While F[k] = 0 do dec(k);

                For i:= 1 to k do q:= q * 10 + F[i];
          End;

Procedure numfre;
          Var
                num,i: longint;
                   fo: text;
          Begin
                Assign(fo, output);
                        Rewrite(fo);

                num:= 0;
                For i:= a to b do
                        Begin
                                rev(i);
                                If eculide(i,q) = 1 then inc(num);
                        End;

                        Writeln(fo, num);
                Close(fo);
          End;


Begin
        init;
        numfre;
End.

Code mẫu của skyvn97

#include<stdio.h>
#define MAX   30500
long a,b,i;
long inv[MAX+5];
long gcd(long a,long b)
{
    if (a*b==0) return (0);
    if (a==b) return (a);
    if (a>b) return gcd(b,a);
    if (b%a==0) return (a);
    return (gcd(b%a,a));
}
long inver(long n)
{
    if (inv[n]>0) return (inv[n]);
    if (n<10) return (n);
    long p=1;
    while (p<=n) p=p*10;
    p=p/10;
    int b=n%10;
    int a=n/10;
    inv[n]=b*p+inver(a);
    return (inv[n]);

}
void getinverse(void)
{
     long i,tmp;
     for (i=1;i<=MAX;i=i+1) tmp=inver(i);              
}
int main(void)
{    
    getinverse(); 
    scanf("%ld",&a);
    scanf("%ld",&b);
    long count=0;
    for (i=a;i<=b;i=i+1)        
        {
         if (gcd(i,inv[i])==1) count++;
        }
    printf("%ld",count);    
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.