xdoj--1077: (循环节长度)
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: (循环节长度)的更多相关文章
- xdu_1077:循环节长度
题意很简单,就是给出p,q,求p/q的循环节长度. 由循环小数的循环部分的值等于等比数列求和的值S,列公式得到最简分数分母的值.最终得10^x%q==1(其中q为经过modify之后的值).搞清这些之 ...
- HDU3977(斐波那契数列模n的循环节长度)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...
- AC日记——计算循环节长度 51nod 1035
最长的循环节 思路: 我们尝试一种最简单的方法,模拟: 如何模拟呢? 每个数,对它模k取余,如果它的余数没有出现过,就补0继续模: 所以,当一个余数出现两次时,当前的长度即为循环节长度: 来,上代码: ...
- 1/n循环节长度
/* * 求1/i的循环节长度的最大值,i<=n */ ; int res[MAXN]; // 循环节长度 int main() { memset(res, , sizeof(res)); in ...
- java 循环节长度
循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153- 其循环节为[846153] 共有6位. 下面的方法,可以求出循环 ...
- java实现第六届蓝桥杯循环节长度
循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...
- 蓝桥杯-循环节长度-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- Java求循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节.比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位.下面的方法,可以求出循环节的长 ...
- ACM(数学问题)——UVa202:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。
主要思路: 通过模拟除法运算过程,来判断循环节结束的位置,不断将余数*10再对除数取余得到新的余数,并记录下来,知道出现的余数之前出现过,此时小数开始循环. 例如: 假设 -> a ...
随机推荐
- Flexbox 布局的最简单表单 (转)
作者: 阮一峰 弹性布局(Flexbox)逐渐流行,越来越多人使用,因为它写 CSS 布局真是太方便了. 三年前,我写过 Flexbox 的介绍(上,下),但是有些地方写得不清楚.今天,我看到一篇教程 ...
- 在Windows系统下搭建ELK日志分析平台
简介: ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索 ...
- ubuntu下唤醒或休眠远程计算机
ubuntu让我明白,没有什么完美的东西,要想完美必须付出代价.要么花时间折腾,要么花时间赚钱买系统. 人生也是一样,所以不要期待什么完美.哪有那么好的人,在合适的时间合适的地点让你遇见,还对你有感觉 ...
- Win10系列:UWP界面布局基础8
路由事件 XAML不仅继承了传统的事件处理方式,还引入了一个增强型事件处理机制:路由事件(RoutedEvent).路由事件和传统事件的不同是:路由事件允许一个对象触发事件后,可以同时拥有多个事件接收 ...
- js 图片延时加载
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 实现django admin后台到xadmin后台的转变
虽然不做前端,还是喜欢好看的东西~.~ 之前同事估计也是功能实现没空管这个后台,前段时间闲的,稍微改了下外貌,前后对比下: Python3.5+Django1.9.7+Xadmin0.6.1 步骤如下 ...
- Jdbc连接数据库基本步骤
Jdbc连接数据库的基本步骤: package demo.jdbc; import java.sql.Connection; import java.sql.DriverManager; import ...
- Yii2.0 数据库查询 [ 2.0 版本 ]
下面介绍一下 Yii2.0 对数据库 查询的一些简单的操作 User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的 ...
- VSTO:使用C#开发Excel、Word【1】
<Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath >——By Eric C ...
- 5.6 C++重载下标操作符
参考:http://www.weixueyuan.net/view/6384.html 总结: 下标操作符是必须要以类的成员函数的形式进行重载的.其在类中的声明格式如下: 返回类型 & ...