生活随笔
收集整理的這篇文章主要介紹了
poj1150
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題告訴我們遞推一定要慢慢細細的推
Pmn=n!/m!,我們可以先考慮n!的最后一位是什么
首先最后一位非0位我們首先想到把0都干掉
也就是先把2和5提出來,這兩個其實是同樣的方法
對于N!中有多少個因數2 f(n)=f(n div 2)+ n div 2這個不難想
提出2和5之后剩下來的數我們只要考慮末位,只可能是1,3,7,9
當我們討論末位為x時,設f(n,x)表示N!中提出2和5后某位是x的個數
首先一個數列實際上可以分成偶數列和奇數列,以1*2*3*4*5*6*7*8*9*10為例
分成1 3 5 7 9, 2 4 6 8 10
這樣我們嘗試分別進行統計,可以發現,實際上2 4 6 8 10中把2提出來就是 1 2 3 4 5 又回到了對n!這種問題
所以不難得到f(n,x) = f(n/2,x) + g(n,x),g(n)表示奇數列中的數目,所以我們需要解決g(n)
觀察奇數列,實際上又分成了兩部分非5的倍數以及5的奇倍數
根據上面處理的經驗不難得到?g(n,x) = n/10+(n%10 >= x)+g(n/5,x) ?
這樣對于n!的最末非0位就處理出來了
而對于n!/m!,我們只要求出m~n之間的2和5的個數,某位為1,3,7,9的個數
這顯然可以用前綴合德思想搞,但要注意2和5的個數誰多誰少
1 const table:
array[
1..
4,
0..
3]
of longint=((
6,
2,
4,
8),
2 (
1,
3,
9,
7),
3 (
1,
7,
9,
3),
4 (
1,
9,
1,
9));
5 var a:
array[
0..
5]
of longint;
6 f,i,n,m,ans:longint;
7
8 function get2(x:longint):longint;
9 begin
10 if x=
0 then exit(
0)
11 else exit(x shr
1+get2(x shr
1));
12 end;
13
14 function get5(x:longint):longint;
15 begin
16 if x=
0 then exit(
0)
17 else exit(x
div 5+get5(x
div 5));
18 end;
19
20 function getx(n,x:longint):longint;
21 begin
22 if n=
0 then exit(
0)
23 else
24 if n
mod 10>=x
then exit(
1+n
div 10+getx(n
div 5,x))
25 else exit(n
div 10+getx(n
div 5,x));
26 end;
27
28 function get(n,x:longint):longint;
29 begin
30 if n=
0 then exit(
0)
31 else exit(get(n shr
1,x)+
getx(n,x));
32 end;
33
34 begin
35 while not eof
do
36 begin
37 readln(n,m);
38 m:=n-
m;
39 a[
1]:=get2(n)-
get2(m);
40 f:=get5(n)-
get5(m);
41 if a[
1]<f
then
42 begin
43 writeln(
5);
44 continue;
45 end;
46 ans:=
1;
47 a[
2]:=get(n,
3)-get(m,
3);
48 a[
3]:=get(n,
7)-get(m,
7);
49 a[
4]:=get(n,
9)-get(m,
9);
50 if a[
1]<>f
then
51 ans:=ans*table[
1,(a[
1]-f)
mod 4]
mod 10;
52 for i:=
2 to 4 do
53 ans:=ans*table[i,a[i]
mod 4]
mod 10;
54 writeln(ans);
55 end;
56 end.
View Code ?
轉載于:https://www.cnblogs.com/phile/p/4473120.html
總結
以上是生活随笔為你收集整理的poj1150的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。