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. [转]关于ReentrantLock中线程读某个变量是否需要加锁

    我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下: public class Main { pr ...

  2. 机器学习---笔记----Python基础

    一. python简介 1. python 具有丰富强大的库,常被称为胶水语言,能够把用其他语言制作的各种模块很轻松地联结在一起 2. python强制使用空白符(white space)作为语句缩进 ...

  3. ssd物体检测模型训练和测试总结

    参考网址:github:https://github.com/naisy/realtime_object_detection 2018.10.16ssd物体检测总结:切记粗略地看一遍备注就开始训练模型 ...

  4. isScroll 插件在iPhone 5s 和以上版本

    才加入这个移动项目组三天,解决一个同事(请假),解决一个切换头部tab 选型时,下拉数据,再次切换到另外一个选项时,出现滚动条距离顶部有些距离,当频繁操作会出现距离顶部距离加大问题(第二天衍生出其他b ...

  5. bzoj1261

    题解: 看到了树 很明显就是树形dp吗 然后随便yy一下方程就好了 代码: #include<bits/stdc++.h> using namespace std; int n,j; ], ...

  6. mysql数据库存储引擎及区别

    MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...

  7. loadrunner json参数化

    因为json格式有{},所以LR参数化时如果也用默认的{}的话,会冲突,这样脚本运行时就无法识别,导致不能正确的读取参数化文件里的内容,此时把参数化的{}改成其他符号即可,比如<>

  8. MicroBlaze核的串行接口实验:SPI UART

    reference : https://blog.csdn.net/weixin_42413559/article/details/80720566 串行接口:SPI UART XPS->SDK ...

  9. Centos7安装RabbitMQ解决Erlang依赖报错

    通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...

  10. 干货分享!DevExpress v17.1最新版帮助文档下载大全

    DevExpress v17.1.5帮助文档下载列表大全来啦!包含.NET.VCL.HTML/JS系列所有帮助文档,提供CHM和PDF两个版本.除已停止更新的Silverlight.Windows 8 ...