USACO-Factorials(阶乘最后一个非0数)
2017-03-15 13:06
309 查看
一开始想的是每乘一位取最后一位数。
然后发现一个反例 14!=87178291200 ,15!=1307674368000 。
而2∗15/10=3 。
因为当乘上一个5时,会使得原来的最后一位数变成0,而新的最后一位数是由原来最后一位数的进位和原来的倒数第二位的最后一位数决定的。所以不能用这种方法。
所以考虑先把所有的因子5提出来,然后与2抵消,最后乘法中就不会出现最后一位非0数被消掉的情况了。
如:1∗2∗3∗4∗5∗6∗7∗8∗9∗10=1∗1∗3∗2∗1∗6∗7∗8∗9∗2∗10∗10
然后发现一个反例 14!=87178291200 ,15!=1307674368000 。
而2∗15/10=3 。
因为当乘上一个5时,会使得原来的最后一位数变成0,而新的最后一位数是由原来最后一位数的进位和原来的倒数第二位的最后一位数决定的。所以不能用这种方法。
所以考虑先把所有的因子5提出来,然后与2抵消,最后乘法中就不会出现最后一位非0数被消掉的情况了。
如:1∗2∗3∗4∗5∗6∗7∗8∗9∗10=1∗1∗3∗2∗1∗6∗7∗8∗9∗2∗10∗10
/* ID: xdujlx1 PROG: fact4 LANG: C++ */ #include<bits/stdc++.h> using namespace std; < f6bf span class="hljs-keyword">void ioinit() { freopen("fact4.in","r",stdin); freopen("fact4.out","w",stdout); } int a[10007]; int main() { ioinit(); int n; cin>>n; int res=1; int cnt=0; for(int i=1;i<=n;i++) a[i]=i; for(int i=5;i<=n;i+=5) { while(a[i]%5==0) { a[i]/=5; cnt++; } } for(int i=2;i/2<=cnt;i+=2) a[i]/=2; for(int i=2;i<=n;i++) { res*=a[i]; while(res%10==0) res/=10; res%=10; } cout << res << endl; return 0; }
相关文章推荐
- [USACO3.2]阶乘 Factorials
- USACO 3.2 Factorials阶乘(高精度)
- USACO 3.2 Factorials
- USACO Section 3.2 Factorials(n!求最右边非零数)
- USACO 3.2 Factorials(高精度乘法)
- USACO Section 3.2 Factorials (fact4)
- 洛谷P2726 阶乘 Factorials
- 阶乘 最后一个不为0的数
- USACO 3.2 Factorials
- usaco-Section 3.2-Factorials
- light oj 1189 - Sum of Factorials (阶乘+贪心)
- USACO Section 3.2 Factorials
- 阶乘最右边非0数
- 【USACO 3.2】Factorials(阶层非零尾数)
- USACO-Section 3.2 Factorials(模拟)
- usaco Factorials
- usaco Factorials
- 大阶乘求右边开始不为零的数——USACO3.2.1
- USACO Factorials
- 获取阶乘n!的最后一个非零数字