洛谷P1134阶乘问题(数论,末尾0的个数变形,思维转换)

题目链接:https://www.luogu.org/problemnew/show/P1134

读完这道题发现它和51nod1003阶乘后面0的数量非常相似,只不过它变形了一下,要求你对2*5产生0有更加深刻的理解(0可以消掉,既然求非0位也就不必再乘,把多出来的2乘上即可)!

 1 #include <iostream>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 int main()
 6 {
 7     ios::sync_with_stdio(false); cin.tie(0);
 8 
 9     ll n;
10     cin>>n;
11 
12     ll x=n,s2=0,s5=0;//1.求多出的2个数(也可以循环找每个因子是2,5的加起来算,只不过这样算比较快!)
13     while(x)
14     {
15         s2+=x/2;
16         x/=2;
17     }
18     x=n;
19     while(x)
20     {
21         s5+=x/5;
22         x/=5;
23     }
24     ll s=s2-s5;
25 
26     ll ans=1;
27     for(ll i=2;i<=n;i++)//2.暴力计算除去2,5的阶乘最后一位
28     {
29         ll t=i;
30         while(t%2==0) t/=2;
31         while(t%5==0) t/=5;
32 
33         ans=ans*t%10;
34     }
35     for(ll i=1;i<=s;i++) ans=ans*2%10;//3.多余的2*上(因为它影响着整个结果,也影响着最后一位)
36 
37     cout<<ans<<endl;
38 
39     return 0;
40 }

完。

原文地址:https://www.cnblogs.com/redblackk/p/9951642.html