hdu 1066 Last non-zero Digit in N! 数学,求n!最后一位非零数
2014-07-27 21:02
591 查看
题意:求n!的最后一位非零数。(n很大,需要字符输入)
题解:
我们发现n!末尾的0都是通过5和2想成得到的,我们将n分成20个数一组,最后剩下不足20个数。我们来讨论【1-20】这20个数中含有5的数,只有5,10,15,20是5的倍数,我们还要找4个2来使之乘积得到10(我们从4和12中取,4取了后剩余1,12取了后剩下3),那么剩下数乘积的尾数就是所有尾数的乘积%10了(5的倍数的剩余数先不管),最后剩余的乘积是6,;再讨论【21-40】,5个倍数是25,30,35,40,那么我们取2来自24和32,同样最后剩余的尾数值是6。,以此类推最后每20个数剩余的尾数都是6。我们记这次的操作为fun(n),那么最后要求的尾数6^(n/20)*fun(n/5)*不足20个的尾数。
其中fun(n/5)是5的倍数除掉一个5后剩余的数,正好构成1~n/5,正好是一个递归;而6^(n/20)的尾数是6(6乘以6尾数还是6);而不足20个的数,我们可以预处理出来(预处理的时候要注意5的倍数也要处理,因为fun(n/5)包含了这里的5的倍数)。除了1以外,其他结果都是偶数,那么乘以6的尾数是不变的。。可以忽略掉
代码:
题解:
我们发现n!末尾的0都是通过5和2想成得到的,我们将n分成20个数一组,最后剩下不足20个数。我们来讨论【1-20】这20个数中含有5的数,只有5,10,15,20是5的倍数,我们还要找4个2来使之乘积得到10(我们从4和12中取,4取了后剩余1,12取了后剩下3),那么剩下数乘积的尾数就是所有尾数的乘积%10了(5的倍数的剩余数先不管),最后剩余的乘积是6,;再讨论【21-40】,5个倍数是25,30,35,40,那么我们取2来自24和32,同样最后剩余的尾数值是6。,以此类推最后每20个数剩余的尾数都是6。我们记这次的操作为fun(n),那么最后要求的尾数6^(n/20)*fun(n/5)*不足20个的尾数。
其中fun(n/5)是5的倍数除掉一个5后剩余的数,正好构成1~n/5,正好是一个递归;而6^(n/20)的尾数是6(6乘以6尾数还是6);而不足20个的数,我们可以预处理出来(预处理的时候要注意5的倍数也要处理,因为fun(n/5)包含了这里的5的倍数)。除了1以外,其他结果都是偶数,那么乘以6的尾数是不变的。。可以忽略掉
代码:
#include <iostream> #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #include <ctime> #include <vector> #include <cmath> #include <cstdlib> using namespace std; const int maxn=1e3+10; int f[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}; char a[maxn]; int c[maxn]; int main() { while(scanf("%s",a)!=EOF) { int i,j,k,n,ans=1,t; n=strlen(a); for(i=0;i<n;i++) c[n-1-i]=a[i]-'0'; while(n>1) { while(c[n-1]==0)n--; ans=ans*f[c[1]%2*10+c[0]]%10; t=0; for(i=n-1;i>=0;i--)//num=num/5; { t=t*10+c[i]; c[i]=t/5; t=t%5; } } printf("%d\n",ans*f[c[0]]%10); } return 0; }
相关文章推荐
- hdu 1066 Last non-zero Digit in N! 求N!的最后一位非0数 N很大
- HDU 1066 Last non-zero Digit in N!
- HDU 1066 Last non-zero Digit in N!
- hdu 1066 Last non-zero Digit in N!
- HDU-1066 Last non-zero Digit in N!
- hdu 1066 Last non-zero Digit in N!【阶乘】
- HDOJ 1066-Last non-zero Digit in N!【阶乘最后非零解:模板】
- hdu 1066 Last non-zero Digit in N! (数论——n!中的最后一个非0数字)
- HDU-1066 Last non-zero Digit in N!
- hdu1066——Last non-zero Digit in N!
- hdu 1066 Last non-zero Digit in N!
- HDU 1066 Last non-zero Digit in N!
- (hdu step 2.3.7)Last non-zero Digit in N!(阶乘最后一位非零位)
- hdu 1066 Last non-zero Digit in N!【阶乘】
- The last non-zero digit in N![hdu-1066]
- pku 1150 The Last Non-zero Digit 阶乘最后一位非零数
- HDU ACM 1066 Last non-zero Digit in N!
- HDOJ--1066--Last non-zero Digit in N!
- HDOJ 1066 Last non-zero Digit in N!
- hdoj1066 Last non-zero Digit in N!(数论)