[51Nod 1035 最长的循环节] 循环小数的性质
生活随笔
收集整理的這篇文章主要介紹了
[51Nod 1035 最长的循环节] 循环小数的性质
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[51Nod 1035 最長的循環節] 循環小數的性質
知識點:數論 循環小數の性質 歐拉公式
1. 題目鏈接##
[51Nod 1035 最長的循環節]
2. 題意描述
正整數k的倒數1/k,寫為10進制的小數如果為無限循環小數,則存在一個循環節,求<=n的數中,倒數循環節長度最長的那個數,假如存在多個最優的答案,輸出所有答案中最大的那個數。
1/6= 0.1(6) 循環節長度為1
1/7= 0.(142857) 循環節長度為6
1/9= 0.(1) 循環節長度為1
(10≤n≤1000)
3. 解題思路
首先,需要介紹一下循環小數的幾個性質。證明論文《康明昌-循環小數》
在這個題,我們需要用到的結論就是第3條。
需要特殊處理的是,分母含2或5的因數。如1235。可以先將2或5的因數提出來:
1235的循環位數是跟 247是一樣多的。而 247循環位數也正是 147的循環位數。
數據比較小,所以暴力枚舉 e<script type="math/tex" id="MathJax-Element-218">e</script>即可。
4. 實現代碼
#include <bits/stdc++.h> using namespace std;typedef pair<int, int> PII;const int MAXN = 1000 + 5;int n;int q_pow(int a, int b, int mod) {int ret = 1;while(b > 0) {if(b & 1) ret = ret * a % mod;a = a * a % mod;b >>= 1;}return ret; }int calc(int x) {while((x & 1) == 0) x >>= 1;while(x % 5 == 0) x /= 5;if(x == 1) return 1;int e = 1;while(q_pow(10, e, x) != 1) e ++;return e; }PII ans[MAXN]; void init() {ans[1] = PII(1, 0);for(int i = 2; i < MAXN; i++) {int z = calc(i);if(ans[i - 1].second <= z) ans[i] = PII(i, z);else ans[i] = ans[i - 1];} }int main() { #ifdef ___LOCAL_WONZY___freopen("input.txt", "r", stdin); #endif // ___LOCAL_WONZY___init();while(~scanf("%d", &n)) {printf("%d\n", ans[n].first);}return 0; }總結
以上是生活随笔為你收集整理的[51Nod 1035 最长的循环节] 循环小数的性质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL间隙锁详解
- 下一篇: device no response,