时间:2021-07-01 10:21:17 帮助过:39人阅读
以前在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; }