yzoj P1122 階乘 題解

2022-05-06 21:30:10 字數 1142 閱讀 9091

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...