您的位置:首页 > 其它

51nod-【1035 最长的循环节】

2016-12-01 16:04 288 查看
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示例
10


Output示例

7

循环节:主要有2个定理:

1、1<=b<a;求b/a的循环节,网上有很多是这样的: 10^k=1mod(a);

这里的a需要把里面2,5这2个因子剔除

为什么是这样呢?其实他是有规律的a,b是互质的

举个栗子:1/7,2/7,3/7,4/7,5/7;他们的循环节的长度都是一样的

所以我们只需要求出1/7的循环节就行了;当然求循环节就是模拟

除法

定理2:如果1<=b<a,a没有2或5的质因子,并且a与b互质,

那么b/a 的循环节位数必整除欧拉函数(a)

#include<cstdio>

int main()
{
int n,i,sum=0,ans;
scanf("%d",&n);
for(i=2;i<=n;++i)
{
int temp=i;
while(temp%2==0)
temp/=2;
while(temp%5==0)
temp/=5;
int g=1,tsum=0;
if(temp==1)
tsum=1;
else
{
do
{
g*=10;
g%=temp;
++tsum;
}while(g!=1);
}
if(tsum>sum)
{
sum=tsum;
ans=i;
}
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: