洛谷P1134 阶乘问题

1 数论真是奇妙……写过:求N!后面有多少个0这个问题Coder可能多少会有点想法,我再说一下吧,能贡献0的只有25,(10也可以分成25),而2个数不少于5的个数(事实上只有N==1时才取等于)所以只需要对1~N之间的个数(包含)进行整数分解,累加因子为5的个数,代码可以写成这样
int sum=0;
while(N)
{
	sum+=(N/5);
	N/=5;
)

1 1~N中显然是5的倍数的有N/5个,当然有的数可能含多个因子5,含两个5的个数为N/25,三个的为N/125……,这不正是上述代码嘛,好了,回到这一题, 这一题的结果肯定是2,4,6,8,中的一个,至于为什么,上面我们说了,因子2的个数大于5的个数(N==1除外),一部分的2和5一起贡献的0,只要还有一个2,那么所求的数一定是偶数,对吧,那我们就可以现将多余2的个数存起来,然后将那些剔除因子2和5的数暴力求出来,这是可以放心Mod10了,再将那些2乘起来,就可以了,
#pragma GCC optimize(2)
#include<bits/stdc++.h>

using namespace std;

#define pi acos(-1.0)
#define e exp(1.0)
typedef long long unsigned ll;
const ll maxn=5e7+7;
ll N,M;
ll Han(ll n)
{
	ll i,j;
	while(n%2==0)
	{
		M++;
		n/=2;
	}
	while(n%5==0)
	{
		M--;
		n/=5;
	}
	return n;
}
ll Pow_mod(ll a,ll b)
{
	ll mul=1;
	while(b)
	{
		if(b&1)
		mul=mul*a%10;
		a=a*a%10;
		b>>=1;
	}
	return mul;
 } 
int main()
{
//	freopen(".../.txt","w",stdout);
	ios::sync_with_stdio(false);
	while(cin>>N)
	{
		if(N==1)//特判 
		{
			cout<<"1"<<endl;
			continue;
		}
		ll i,j,Mul=1;
		M=0;
		for(i=2;i<=N;i++)
		Mul=Mul*(Han(i))%10;
		for(i=1;i<=M;i++)
		Mul=Mul*2%10;
		cout<<Mul<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值