以前在XTU的比賽中做過這個(gè)題,當(dāng)時(shí)沒過,到后面還是用了個(gè)猥瑣的方法過的。 可能是不記得了當(dāng)時(shí)用的高精度法沒過,這次看到這題直接采用赤裸裸的高精度,結(jié)果... 在本地跑那速度.....= =|||| 于是乎,還是采用了猥瑣的方法;但是為什么每次mod100000呢??
以前在XTU的比賽中做過這個(gè)題,當(dāng)時(shí)沒過,到后面還是用了個(gè)猥瑣的方法過的。
可能是不記得了當(dāng)時(shí)用的高精度法沒過,這次看到這題直接采用赤裸裸的高精度,結(jié)果... 在本地跑那速度.....= =||||
于是乎,還是采用了猥瑣的方法;但是為什么每次mod100000呢??而每次mod10000就WA呢?
解釋:
首先我們不能采用赤裸裸的保留末位非零數(shù)的方法。
原因:進(jìn)位,使得末位為0;而在一種情況下,會(huì)發(fā)生進(jìn)位,兩乘數(shù)含有2和5的因子,末位為0的數(shù)例如x*10==x*2*5,所以末位為零一定包含了這兩個(gè)因子!而其他情況下是不會(huì)發(fā)生末位為0的進(jìn)位的。通過這樣便可以將所有使得進(jìn)位的因素去除,去掉等量的2和5,以保持不進(jìn)位,再通過保留個(gè)位的方式得出答案。
那么為啥每次要mod100000,當(dāng)A,B∈[1,4220]最多有多少進(jìn)位使得末位為0?(5^5=3125)<4220<(5^6);所以在[1,4220]中最多有5個(gè)5的因子,通過與2綁定形成的數(shù)最大為3125*(2^5)=100000;所以最大的進(jìn)位也就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; }
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com