51NOD 1035 最长的循环节(数论)

传送门

正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数。

1/6= 0.1(6) 循环节长度为1

1/7= 0.(142857) 循环节长度为6

1/9= 0.(1) 循环节长度为1

Input

输入n(10 <= n <= 1000)

Output

输出<=n的数中倒数循环节长度最长的那个数

Input示例

10

Output示例

7

解题思路:

因为是求的 1/x 的最长循环节,所以我们可以将1扩大10^1000倍,这里面肯定就会有循环节了,而且我们只需要对 x 取余就行了。也就是求10^k%x,然后找到第一个数,再找到的时候就是循环节了。

正解应该是:

要求一个 10^x≡1(modC) 如果gcd(10,C)!=1的话,显然无解。如果存在解的话,根据欧拉公式,那么这个解 x|phi(C),所以直接暴力枚举x就好了。

My Code(水过):

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1e3+5;
int len[MAXN], mod[MAXN];
void Init()
{
    memset(len, 0, sizeof(len));
    for(int i=2; i<MAXN; i++)
    {
        int ans = 1000000%i, tmp = 1000000%i;
        if(ans == 0)
        {
            len[i] = 0;
            continue;
        }
        for(int j=0; j<MAXN; j++)
        {
            ans *= 10;
            ans %= i;
            if(ans == tmp)
            {
                len[i] = j+1;
                break;
            }
        }
    }
    int Max = -1, k;
    for(int i=2; i<MAXN; i++)
    {
        if(len[i] > Max)
        {
            Max = len[i];
            k = i;
        }
        len[i] = k;
    }
}
int main()
{
    Init();
    int n;
    while(cin>>n)
    {
        cout<<len[n]<<endl;
    }
    return 0;
}
时间: 2024-07-30 08:51:43

51NOD 1035 最长的循环节(数论)的相关文章

51Nod - 1035 最长的循环节

51Nod - 1035 最长的循环节 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 1000) Output 输出<=n的数中倒数循环节长度最长的那个数 Input示例 10 Outp

51Nod 最长的循环节(打表预处理)

正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 1000) Output 输出<=n的数中倒数循环节长度最长的那个数 Input示例 10 Output示例 7 #include <

51nod 1035:最长的循环节

1035 最长的循环节 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 1000) Output 输出<=n的数中倒数循环节长度最长的那个数 Input示例

1035 最长的循环节

1035 最长的循环节 基准时间限制:1 秒 空间限制:131072 KB 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 1000) Output 输出<=n的数中倒数循环节长度最长的那个数 Input示例 10 Output示例 7思路

AC日记——计算循环节长度 51nod 1035

最长的循环节 思路: 我们尝试一种最简单的方法,模拟: 如何模拟呢? 每个数,对它模k取余,如果它的余数没有出现过,就补0继续模: 所以,当一个余数出现两次时,当前的长度即为循环节长度: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,ans=0,k=1,d,p=0,flag; boo

51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)

1037 最长的循环节 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 10^18) Output 输出<=n的数中倒数循环节长度最长的

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

题目链接:点击打开链接 题意: 给定一个字符串str 求字符串str的 循环节个数为 1-len 个的 最长子串长度 思路:套用kmp的性质 #include<string.h> #include<stdio.h> #include <iostream> using namespace std; #define n 1300 void getnext(char str[n],int next[n]){ int m=strlen(str); next[0]=next[1]

数论基础——循环节和矩阵快速幂的运用

首先我们来看一道基础题: 题目链接:HDU1005 Number Sequence 题目描述: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 147421    Accepted Submission(s): 35814 Problem Description A number sequence is

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/details/52577212 [分析]一开始想简单了,对于a^x mod p这种形式的直接用欧拉定理的数论定理降幂了 结果可想而知,肯定错,因为题目并没有保证gcd(x,s+1)=1,而欧拉定理的数论定理是明确规定的 所以得另谋出路 那么网上提供了一种指数循环节降幂的方法 具体证明可以自行从网上找一找 有