 #include <iostream>
#include <iostream>
 #define MAX 10001
#define MAX 10001
 using namespace std;
using namespace std;

 bool prime[ MAX ] =
bool prime[ MAX ] =  {false};
{false};
 int r[ MAX ];
int r[ MAX ];
 int ff[ MAX ] , kf;
int ff[ MAX ] , kf;
 bool v[ MAX ];
bool v[ MAX ];
 int rank[ MAX ];
int rank[ MAX ];
 __int64 ans[MAX];
__int64 ans[MAX];
 int k;
int k;

 void factor (int n)
void factor (int n)


 {
{
 int i;
    int i;
 for (i = 2 ; i <= n ; ++ i)
    for (i = 2 ; i <= n ; ++ i)

 
     {
{
 while (n % i == 0)
        while (n % i == 0)

 
         {
{
 n /= i;
            n /= i;
 r[ i ] ++;
            r[ i ] ++;
 }
        }
 if (n == 1)
        if (n == 1)
 break;
            break;
 if (prime[ n ])
        if (prime[ n ])

 
         {
{
 r[ n ] ++;
            r[ n ] ++;
 break;
            break;
 }
        }
 }
    }
 }
}

 int main()
int main()


 {
{
 int i , j;
    int i , j;
 int n , g;
    int n , g;
 __int64   tt;
    __int64   tt;
 kf = 0;
    kf = 0;
 for (i = 2 ; i <= MAX ; ++ i)
    for (i = 2 ; i <= MAX ; ++ i)
 prime[ i ] = true;
        prime[ i ] = true;
 for (i = 2 ; i <= MAX ; ++ i)
    for (i = 2 ; i <= MAX ; ++ i)
 if (prime[ i ])
        if (prime[ i ])

 
         {
{
 ff[++ kf] = i;
            ff[++ kf] = i;
 rank[ i ] = kf;
            rank[ i ] = kf;
 for (j = i + i ; j <= MAX ; j += i)
            for (j = i + i ; j <= MAX ; j += i)
 prime[ j ] = false;
                prime[ j ] = false;
 }
        }
 
        
 while (scanf ("%d" , &n) , n)
        while (scanf ("%d" , &n) , n)

 
         {
{
 g = 2;
            g = 2;
 memset (r , 0 , sizeof (r));
            memset (r , 0 , sizeof (r));
 for (i = 2 ; i <= n ; ++ i)
            for (i = 2 ; i <= n ; ++ i)

 
             {
{
 if (prime[ i ])
                if (prime[ i ])

 
                 {
{
 r[ i ] ++;
                    r[ i ] ++;
 if (i > g)
                    if (i > g)
 g = i;
                        g = i;
 }
                }
 else
                else
 factor (i);
                    factor (i);
 }
            }
 k = 1;
            k = 1;
 ans[ 1 ] = 1;
            ans[ 1 ] = 1;
 int tmp = 0;
            int tmp = 0;
 for (i = 1 ; i <= rank[ g ] ; ++ i)
            for (i = 1 ; i <= rank[ g ] ; ++ i)

 
             {
{
 tt = (r[ff[ i ]] << 1) + 1;
                tt = (r[ff[ i ]] << 1) + 1;
 for (j = 1 ; j <= k ; ++ j)
                for (j = 1 ; j <= k ; ++ j)

 
                 {
{
 ans[ j ] = ans[ j ] * tt + tmp;
                    ans[ j ] = ans[ j ] * tt + tmp;
 tmp = ans[ j ] / 10000 , ans[ j ] %= 10000;
                    tmp = ans[ j ] / 10000 , ans[ j ] %= 10000;
 }
                }
 while (tmp)
                while (tmp)
 ans[++ k] = tmp % 10000 , tmp /= 10000;
                    ans[++ k] = tmp % 10000 , tmp /= 10000;
 }
            }
 printf ("%I64d" , ans[ k ]);
            printf ("%I64d" , ans[ k ]);
 for (i = k - 1 ; i > 0 ; -- i)
            for (i = k - 1 ; i > 0 ; -- i)
 printf ("%04I64d" , ans[ i ]);
                printf ("%04I64d" , ans[ i ]);
 printf ("\n");
            printf ("\n");
 }
        }
 return 0;
        return 0;
 }
}
这题其实是求(n!)^2的约数的个数,注意要大数处理。其余的自己去算吧,orz~~~~~~