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

Posted 十年换你一句好久不见

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
int a[1006][3],b[1006],n;
int solve(int n)
{
    int now=1;
    for(int i=0;i<=1000;i++)
    {
        b[i]=now%n;
        now=now%n;
        now*=10;
    }
    for(int i=999;i>=0;i--)
        if(b[i]==b[1000]) return 1000-i;
}
int main()
{
    for(int i=1;i<=1000;i++)
    {
        a[i][0]=solve(i);
    }
    a[1][1]=1;
    for(int i=2;i<=1000;i++)
    {
        if(a[i][0]<a[i-1][0])
        {
            a[i][0]=a[i-1][0];
            a[i][1]=a[i-1][1];
        }
        else a[i][1]=i;
    }
    scanf("%d",&n);
    printf("%d\n",a[n][1]);
    return 0;
}

 

以上是关于51Nod 最长的循环节(打表预处理)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1035:最长的循环节

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

51nod - 1035 最长的循环节

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

51nod1483(打表)

ACM学习历程—51NOD 1770数数字(循环节)