#include <iostream> //计算 n!的最后一位非零位,时间复杂度为0(logn)
#include <cmath>
using namespace std;
int fac[10];
int get2(int n)
{
if(n==0)
return 0;
return n/2+get2(n/2);
}
int get5(int n)
{
if(n==0)
return 0;
return n/5+get5(n/5);
}
int g(int n,int x)
{
if(n==0)
return 0;
return n/10+(n%10>=x)+g(n/5,x);
}
int getx(int n,int x)
{
if(n==0)
return 0;
return getx(n/2,x)+g(n,x);
}
int main()
{
int n;
while(cin>>n)
{
fac[2]=get2(n); // fac[2]肯定大于fac[5]
fac[5]=get5(n);
fac[3]=getx(n,3);
fac[7]=getx(n,7);
fac[9]=getx(n,9);
int t=fac[2]-fac[5]; // t 表示因子2跟5合并后剩下的2的数量
while(t>=5) // 2^5 % 10 = 2 ,所以 5 是循环周期
{
t=t/5+t%5;
}
fac[3]%=4;fac[7]%=4;fac[9]%=4; // 3^4 % 10 = 1 , 7^4 % 10 = 1 , 9^4 % 10 = 1
printf("%5d -> %d\n",n, int( pow(2.0,t) * pow(3.0,fac[3]) * pow(7.0,fac[7]) * pow(9.0,fac[9]) ) % 10 );
}
return 0;
}
poj 1604 Just the Facts
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Just the Facts(P1604)
#include#include#include#inc while (cin>>n) { printf("%5d -> ",n); long long ans=1; f
integer each output input git -
poj 1604
题意:计算n!最后一位不为0的数解题思路:clude#include#inc
数学 #include 模运算 i++