视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
[U]3.2.1Factorials有点点意思的水题
2020-11-09 07:43:20 责编:小采
文档


以前在XTU的比赛中做过这个题,当时没过,到后面还是用了个猥琐的方法过的。 可能是不记得了当时用的高精度法没过,这次看到这题直接采用赤裸裸的高精度,结果... 在本地跑那速度.....= =|||| 于是乎,还是采用了猥琐的方法;但是为什么每次mod100000呢??

以前在XTU的比赛中做过这个题,当时没过,到后面还是用了个猥琐的方法过的。

可能是不记得了当时用的高精度法没过,这次看到这题直接采用赤裸裸的高精度,结果... 在本地跑那速度.....= =||||

于是乎,还是采用了猥琐的方法;但是为什么每次mod100000呢??而每次mod10000就WA呢?

解释:

首先我们不能采用赤裸裸的保留末位非零数的方法。

原因:进位,使得末位为0;而在一种情况下,会发生进位,两乘数含有2和5的因子,末位为0的数例如x*10==x*2*5,所以末位为零一定包含了这两个因子!而其他情况下是不会发生末位为0的进位的。通过这样便可以将所有使得进位的因素去除,去掉等量的2和5,以保持不进位,再通过保留个位的方式得出答案。

那么为啥每次要mod100000,当A,B∈[1,4220]最多有多少进位使得末位为0?(5^5=3125)<4220<(5^6);所以在[1,4220]中最多有5个5的因子,通过与2绑定形成的数最大为3125*(2^5)=100000;所以最大的进位也就100000。

Code:

/*
ID:bysen
LANG:C++
PROG:fact4
*/
#include
#define mod 100000
using namespace std;

int main()
{
 	freopen( "fact4.in","r",stdin );
 	freopen( "fact4.out","w",stdout );
 	int n;
 	scanf( "%d",&n );
 	int ans=1;
 	for( int i=1;i<=n;i++ )
 	{
 	 while( ans%10==0 )
 	 	ans/=10;
 	 ans=(ans*i)%mod;
	}	 
	
 	while( ans%10==0 )
 	 ans/=10;
 	
 	printf( "%d\n",ans%10 );
 	return 0;
}

下载本文
显示全文
专题