题目链接: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 }
完。