t組資料,給出n,求出n!最右邊非零的數。
對於30%的資料,n <= 30,t<=10。
對於全部的資料,n <= 10^2009,t<=30。
一道數學題
解析n!/(10x)最後一位數字即是結果。10x進行拆分,變成5^x* 2x。怎麼除以5x呢,好辦,乘的時候含有5的倍數的一項全部不乘進去,再遞迴此過程。即
1 2 3 4 (15) 6 7 8 9 (25)
11 12 13 14 (35)16 17 18 19 (45)
21 22 23 24 (55) 26 27 28 29 (65) ...
再遞迴處理
1 2 3 4 (1*5) 6
而且可以發現,不算5倍數一項進去,每十個一組,最末尾結果是一樣的:6,且6*6還是6!
接下來的問題,怎麼除2^x呢?
分析發現:
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 =16=(6)
且2,4,6,8乘以6最末尾還是原來的數。所以,可以分析看x%4是多少,若為1,說明原來的結果相當於多乘了乙個2(其他的那些2剛好是4的倍數,不影響結果),所以,我們本來是要除以2的,但是很顯然對結果再補乘3個2(2^3)即可消除影響,得到正確答案。其他情況同理。至此,思路理順。
**
#includeusing namespace std;
int t,n,ans,mod,rest,x;
bool flag;
const int v[10]=;
char s[3000];
int a[3000];
const int k[4]=;
int main()
ans=1;
mod=0;
flag=0;
while(1)
while((n>0)&&(a[n]==0)) n--;
if(n==0) break;
flag=true;
mod=(mod+a[2]*10+a[1])%4;
}if(flag) ans=(ans*k[mod])%10;
printf("%d\n",ans);
}return 0;
}
大數階乘題解
參考 階乘,遞迴函式,c語言常見資料型別範圍,算術溢位,高精度演算法 階乘 乙個正整數的階乘 factorial 是所有小於及等於該數的正整數的積,並且0的階乘為1。自然數n的階乘寫作n 1808年,基斯頓 卡曼引進這個表示法。亦即n 1 2 3 n。階乘亦可以遞迴方式定義 0 1,n n 1 n。...
yzoj P2344 斯卡布羅集市 題解
共t條街對於每一條街上有n個店鋪 n可能不相同 每次只能選兩端第乙個營業的店鋪採購,採購第i個店鋪會獲得幸福度ai,採購完後,這個店鋪和它相鄰的店鋪便會關門,問最大幸福度?考場想了一下dp,一開始想一維但發現不好處理,二維引數也沒有想出來,於是便開始了我的暴力瞎搞之旅,我隨手寫了幾個例子發現對於n為...
P1122 最大子樹和 題解
同步 原題鏈結 簡要題意 給定一棵 n nn 個節點的樹,有點權,求其中最大的連通塊之和。資料範圍 n 1.6 1 04 n leq 1.6 times 10 4 n 1.6 104.很顯然,考慮用樹形 dp text dp 解決此題。f uf u fu 表示以 u uu 為根的子樹中包含 u uu...