首页 > 分享 > 12! = 1 x 2 x 3 x 4

12! = 1 x 2 x 3 x 4

洛谷P1134 阶乘问题(计算末尾非零位的值)

最新推荐文章于 2024-02-16 18:24:23 发布

Mr_Kingk 于 2019-09-24 14:18:00 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

该博客介绍了如何计算阶乘问题中,N阶乘最右边的非零位的值。通过分析每个数的个位数字以及2和5的组合产生零的原理,提出只需关注5的个数和每个数的有效位(个位数字)。最终,通过2的个数减去5的个数,并与每个数的个位数字取模运算,可以得到最右侧非零位的值。给出了USACO Training Section 3.2的相关背景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:

12!= 1 times 2 times 3 times 4 times 5 times 6 times 7 times 8 times 9 times 10 times 11 times 12 = 479,001,60012!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600

1212的阶乘最右边的非零位为66。

写一个程序,计算N(1 le N le 50,000,000)N(1≤N≤50,000,000)阶乘的最右边的非零位的值。

注意:10,000,000!10,000,000!有24999992499999个零。

输入格式

仅一行包含一个正整数NN。

输出格式

一个整数,表示最右边的非零位的值。

输入输出样例

输入 #1复制

12

输出 #1复制

6 说明/提示

USACO Training Section 3.2

     因为要计算最右边非零位的值,所以每个数只考虑末尾数字就行了(因为最右边的非零数末尾数是由每个数的个位数字乘起来的,所以只受个位数字的影响),因为末尾零都可以看成是由2*5=10得来的,所以先把每个数都分解乘几个2乘几个5再乘x(x即为每个数分解后得的有效数字(对要计算的最右边非零位的值有影响的数)),显然最终2的个数要比5的个数多,所以有5的个数对2*5变成了末尾的零(这些就不用管了),剩下的(2的个数-5的个数)个2的乘积和每个数分解后得的有效数字(x),共同决定了最终结果,最终要求的末尾非零数字=2^(2的个数-5的个数)*每个数的有效位(即个位数字)%10;

完整代码:

#include <bits/stdc++.h>

#define int long long

using namespace std;

int n,m;//统计2的个数和5的个数的差值

int f(int x)

{

while(x%2==0)

{

m++;

x/=2;

}

while(x%5==0)

{

m--;

x/=5;

}

return x;//x即为每个数分解后得的有效数字(对要计算的最右边非零位的值有影响的数)

}

signed main()

{

ios::sync_with_stdio(false);

cin.tie(0);

cin>>n;

int val=1;

for(int i=2;i<=n;i++) val=val*(f(i))%10;//每个数分解后得的有效数字(x)的个位数的乘积

for(int i=1;i<=m;i++) val=val*2%10;//再乘2^m(为了防止超范围,所以变乘边mod10)

cout<<val<<endl;

return 0;

}

相关知识

12! = 1 x 2 x 3 x 4
二次型f(x 1 ,x 2 ,x 3 ,x 4 )= 的规范形是
4怎么解方程x?方程x
【如果x/2=y/3=z/4,求x+y+z/x+y+z的值】
x=1
己知函数y=f(x)的数据如下: 12 3 4 x,)353
HDU 1395(2^x mod n = 1)
已知函数f(x)=x^3
已知函数f(x)=1/3x^3
在BASIC中 已知X=4 Y=9 A=2 B=‐3 逻辑表达式:X>B AND NOT(X+A>Y+B)的值为()。

网址: 12! = 1 x 2 x 3 x 4 https://m.mcbbbk.com/newsview1115603.html

所属分类:萌宠日常
上一篇: 《魔兽世界》9.0宠物伤害不显示
下一篇: 《魔兽世界》宠物伤害不显数字怎么