TOTALODD - Số lẻ hoàn toàn

Tác giả: hieult

Ngôn ngữ: C++

#include <cstdio>
//#include <conio.h>

    int k[] = {0,1,3,5,7,9};
    int mu5[10],a[500000],mu10[10],b[100000];

int main()
{
    //freopen("TOTALODD.in","r",stdin);

        mu5[0] = 1; mu10[0] = 1;
    for(int i = 1;i<=9;i++)
    {
        mu5[i] = mu5[i-1]*5;
        mu10[i] = mu10[i-1]*10;
    }
    for(int i = 1;i<=5;i++)
    {
        a[i] = k[i];
        b[i] = k[i];
    }
    int chay = 5;
    for(int i = 2;i<=8;i++)
    {
         int t,K;
         for(int j = 1;j<=mu5[i];j++)
         {
              t = a[(j-1)/mu5[i-1]+1];
              a[chay+j] = t*mu10[i-1]+b[(j-1)%mu5[i-1]+1];
         }
         if(i!=8)
              for(int j = 1;j<=mu5[i];j++)
                   b[j] = a[chay+j];
         chay = chay+mu5[i];
    }
    char s[20];
    int n;
    //printf("%d",chay);
    while(scanf("%s",s)>0 && s[1] != 'E')
    {
         scanf("%d",&n);
         int u,v,r,min = 100000001;
         if(n>=a[chay])
             u = chay;
         else
         {
             u = 1;v = chay;
             while(v-u >1)
             {
                 r = (u+v)/2;
                 if(a[r]<=n)
                     u = r;
                 else v = r;
             }
         }
         v = 1;
         while(v<=u)
         {
             while(a[v]+a[u]<n) v++;
             if(a[v]+a[u]<min)
                 min = a[v]+a[u];
             u--;
         }
         printf("%d\n",min);
    }
    //getch();
}
    

Download