hdu 1066 數學相關

2021-06-14 06:18:00 字數 1774 閱讀 1121

詳細說明:

#include #include #include using namespace std;

char s[1005];

int len, mp[25] = ;

// 直接計算出其迴圈節為20這裡將0-19的列表於上,當n<5時直接輸出,其餘需要遞迴n/5因為這個表是刪除了所有的5的倍數的

int slove()

}return ans;

}int main()

for (int i = 0; i < len; ++i) // 實現交叉以及去字元

printf("%d\n", slove());

}return 0;

}

#include #include #include #define maxn 1005

using namespace std;

/*該題思路並沒有想著去吧2,5提取出來,如果全部提取出來勢必會去計算2的剩餘量

由於n很大,所以計算起來要用到兩次大數計算除2以及除5後的值再相減再遞迴下去

而只提取5,把2放入原數列進行計算,最後用除2抵消掉5的影響,這樣就可以減少

一次運算了,對於最有乙個非零數,由於n!中2的個數始終多餘5,所以在有剩餘的

情況下,最後這個非零位一定是乙個偶數,因此也就能夠快速計算出除2之後的結果

了,2/2 = 6 (在不等於1的情況下就只有等於6(12/2)了), 4/2 = 2, 6/2 = 8,

/2 = 4, 我們就可以建立乙個表遞迴下去了,也就最多抵消4個2,因為除2是有迴圈

節的。在去除了5的干擾後,我們建立乙個按照每10個元素分組的表來表示1*2*3*4*6*7*8*9

的乙個非零位,5的倍數

在提取了5之後構成乙個新的序列 給定乙個n我們通過n/10來確定其在

哪乙個組,通過n%10來確定其在組內的哪一號元素,通過n/5來確定其遞迴下去的子串行

注意沒有乘以5,10不代表不要統計其位置,我們還是要視作有5的存在,這樣在%10計算的

時候才能精確的找到其在一組中的位置,在確定好了其在哪一組的時候,又乙個好的性質

幫助了我們,因為每組的最後乙個非零位是6,那麼組與組進行相乘得到的非零位還是6

所以我們就可以拋棄組數,組數大於1的話直接遞迴下去乘以6再乘以非零位的精確位置

所存的序列再消去當前序列5的影響就完成了。

f[x] = mp [ (f[x/5] * 6 * table[x%10])%10 ] [(x/5)%4],大數的x/5通過乘以2除以10

來得到%4的求解只與乙個數的後兩位有關

*/char s[maxn];

int mp[10][4] = , , ,

, , ,

, ,,

};int table[10] = ;

int solve(char *s)

}if (len == 0)

else

}if (s[0] >= 10)

s[0] = c;

}else

if (len > 0)

else

return mp[(solve(s) * 6 * table[pos])%10][k%4];

}}int main()

// 化為整數形式

printf("%d\n", solve(s));

memset(s, 0xff, sizeof(s));

}return 0;

}

hdu 1066 數論 遞迴

hdu 1066 last non zero digit in n 起首引用下leemars的呈報 因為 2 n 是以4為輪迴節的 並且table n 是以10為輪迴節的 所以從10開端 f n 5 table n的尾數 6 f n n 10 2 n 5 mod 4 右邊的式子除了f n 5 外 是...

Python數學相關

math包主要處理數學相關的運算。math包定義了兩個常數 math.e 自然常數e math.pi 圓周率pi math.ceil x 對x向上取整 math.floor x 對x向下取整 math.pow x,y 指數運算,得到x的y次方 math.log x 對數,預設基底為e。可以使用bas...

leetcode數學相關

目錄給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。如果小數部分為迴圈小數,則將迴圈的部分括在括號內。輸入 numerator 2,denominator 3 輸出 0.6 思路 返回res.tostring 分母 分子為0的情況 if de...