1077: 循环节长度

时间限制: 1 Sec  内存限制: 128 MB
提交: 103  解决: 37
[提交][状态][讨论版]

题目描述

数一有很多的有理数,然而有的是有限小数,如1/2=0.5,1/5=0.2,这些都很好写,但是对于无限循环小数,数一就发愁了,怎么写得完啊。于是数一就想让你告诉他这些有理数的循环节长度是多少。

输入

多组数据,每组数据是两个整数p,q(0<=p<10^9,0<q<=10^9),表示一个有理数的分子与分母。

输出

若为有限小数,则输出0,若为无限循环小数,请输出循环节长度。

样例输入

1 2
1 3
2 10
2 7
5 6

样例输出

0 1 0 6 1

想法:

1 证明有理数a/b可以写成无限循环小数

1) 根据抽屉原理 存在10^m%b=10^n%b

对于任何b存在一个数c (b|c 且c可以写成10^i(10^j-1)的形式 )

2)a/b=d/c [ d=a*c/b   则d是整数 ]=(d/10^i) * ( 1/(10^j-1) )

3)   x=  1/(10^j-1)  一定是有理小数并且循环节长度为j

方法

1  用bsgs 求解(10^j%b=1)

2 用数组实现hash

代码:

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=;
struct node {
int k1,k2;
int _next;
};
int hs[mod+];
node hn[mod+]; int cnt;
int gcd (int x,int y) {
return !y?x:gcd(y,x%y);
}
void _add (int x, int key) {
int head=x%mod;
hn[++cnt].k2=key; hn[cnt].k1=x;
hn[cnt]._next=hs[head];
hs[head]=cnt;
}
int _find (int x) {
int head=x%mod;
for (int i=hs[head];i!=-;i=hn[i]._next) {
if (hn[i].k1==x)
return hn[i].k2;
}
return -;
}
int bsgs (int k,int p) {
cnt=; memset (hs,-,sizeof(hs));
LL x=; int t=sqrt(p)+;
for (int i=;i<t;i++) {
_add (x,i);
x=x*k%p;
}
LL y=;
for (int i=;i<=t;i++) {
y=y*x%p; // 不使用long long 会溢出
int ans=_find(y);
if (ans>=) return i*t-ans;
}
}
int main ()
{
int a,b;
while ( ~scanf ("%d %d",&a,&b) ) {
int k=gcd (a,b); a/=k; b/=k;
while (b%==) b/=;
while (b%==) b/=;
if (b==) printf("0\n");
else printf("%d\n",bsgs(,b) );
}
return ;
}

xdoj--1077: (循环节长度)的更多相关文章

  1. xdu_1077:循环节长度

    题意很简单,就是给出p,q,求p/q的循环节长度. 由循环小数的循环部分的值等于等比数列求和的值S,列公式得到最简分数分母的值.最终得10^x%q==1(其中q为经过modify之后的值).搞清这些之 ...

  2. HDU3977(斐波那契数列模n的循环节长度)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...

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

    最长的循环节 思路: 我们尝试一种最简单的方法,模拟: 如何模拟呢? 每个数,对它模k取余,如果它的余数没有出现过,就补0继续模: 所以,当一个余数出现两次时,当前的长度即为循环节长度: 来,上代码: ...

  4. 1/n循环节长度

    /* * 求1/i的循环节长度的最大值,i<=n */ ; int res[MAXN]; // 循环节长度 int main() { memset(res, , sizeof(res)); in ...

  5. java 循环节长度

    循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153- 其循环节为[846153] 共有6位. 下面的方法,可以求出循环 ...

  6. java实现第六届蓝桥杯循环节长度

    循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...

  7. 蓝桥杯-循环节长度-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  8. Java求循环节长度

    两个整数做除法,有时会产生循环小数,其循环部分称为:循环节.比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位.下面的方法,可以求出循环节的长 ...

  9. ACM(数学问题)——UVa202:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。

    主要思路: 通过模拟除法运算过程,来判断循环节结束的位置,不断将余数*10再对除数取余得到新的余数,并记录下来,知道出现的余数之前出现过,此时小数开始循环. 例如: 假设   ->     a ...

随机推荐

  1. 使用MongoDB数据库(1)(三十五)

    MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...

  2. 解决eclipse/myeclipse导入项目时出现红色叹号的方法

  3. Ubuntu 16.04 中安装谷歌 Chrome 浏览器

    http://jingyan.baidu.com/article/335530da98061b19cb41c31d.html 根据教程安装成功!! http://askubuntu.com/quest ...

  4. 用老毛桃U盘安装:[3]Ghost版Win7系统

    用老毛桃自动安装Ghost版Win7的步骤: 1,到网上先下载Ghost版Win7映像文件到硬盘,我放到的是U盘,盘符为Z,如果你愿意,可直接放到硬盘即可,放到硬盘安装速度会快一点. 2,把制作好的老 ...

  5. It is never too late!

    整理着过去的学习笔记,零零碎碎的,偶尔夹杂着当时的心境. 泛泛的学着东西,不很系统,不很深入,倒像是在拾海,有时捡捡贝壳,有时抓抓螃蟹.叹服大海的神奇,还没来得及深钻某个领域. (以下内容写于2016 ...

  6. 前端小菜鸡使用Vue+Element笔记(一)

    关于使用Vue+Element的项目简介~ 最近因为项目组缺前端人员,所以自己现学现做页面,先把前后台功能调通 觉得前端可真的是不容易呀哎呀~ 首先记录一下相关的Vue入门的教程: vue环境搭建示例 ...

  7. 2.19 C++友元函数和友元类

    参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属 ...

  8. JavaScript 基础,登录前端验证

    <script></script>的三种用法: 放在<body>中 放在<head>中 放在外部JS文件 <!DOCTYPE html> & ...

  9. 几种序列化与get、set方法的关系

    若get开头且第四个字母是大写的方法中有空指针异常时(无论有没有对应属性) 1.阿里巴巴的FastJson会出现空指针异常,证明与get开头的方法有关 2.Google的Gson不会出现异常,因为只和 ...

  10. linux 设置用户自动登出时间

    对所有用户设置自动注销功能: 首先,以root用户登录系统,输入 vi /etc/profile 命令,编辑profile文件. 查找TMOUT,若没有,则可以在文件最后添加如下语句: TMOUT=3 ...