ILSMATH2 - Đếm số giai thừa 2!
Tác giả: hieult
Ngôn ngữ: C++
#include <stdio.h>
//#include <conio.h>
#include <math.h>
#define Pi 3.14159265
#define e 2.71828183
double u,v,m,r;
int so;
void luythua(int k)
{
if(k==1)
{
u = v;
}
else if(k%2==0)
{
luythua(k/2);
u = u*u;
so = so*2;
}
else
{
luythua (k/2);
u = u*u*v;
so = so*2;
}
while(u>10)
{
u=u/10;
so++;
}
}
int f(int x)
{
m = sqrt(2*Pi*x);
v = (x/e);
so = 0;
luythua(x);
u = u*m;
while(u>10)
{
u=u/10;
so++;
}
return so+1;
}
int main()
{
int n;
double Q=1;
int t=0,a[4];
//while(scanf("%d",&n)>0)
//printf("%d\n",f(n));
scanf("%d",&n);
if(n<100000)
{
for(int i = 1;;i++)
{
Q = Q*i;
while(Q>=1)
{
Q = Q/10;
n--;
}
if(Q<1 && n==0)
{
t++;
a[t] = i;
}
if(n<0)
break;
}
if(t==0)
printf("NO");
else
{
printf("%d\n",t);
for(int i = 1;i<=t;i++)
printf("%d\n",a[i]);
}
}
else
{
int U = 1,V=n;
while(V-U>1)
{
int r = (U+V)/2;
if(f(r)>n)
V = r;
else U = r;
}
if(f(U)!=n)
{
printf("NO");
//printf("%d",u);
}
else
{
printf("1\n");
printf("%d",U);
}
}
//getch();
}