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 ...
随机推荐
- asp.net mvc 笔记一
webapi controller 中 action 名称 不能与 View controller 中的 action 名称相同,否则 Url.Action("actionName&quo ...
- laravel框架5.2版本组件包开发
一.包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的, ...
- Java关于反射
反射的概念:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- MYSQL数据库字母数字混合字段排序问题
对MySQL数据表里的一个字符型字段排序,其内容格式为一位字母+顺序数字.数字没有前导零,长度不固定.这种含字母的数字序列,排序出来的结果和我们想要的结果是不一样的,因为它不是纯数字,只能按字符规则排 ...
- angular4-自定义组件
在 Angular 中,我们可以使用 {{}} 插值语法实现数据绑定. 新建组件 $ ng generate component simple-form --inline-template --inl ...
- 1.3 CPU简介
目录 CPU的功能模块 cpu总线 CPU寄存器 16位cpu的寄存器组 32位cpu的寄存器组 64位cpu的寄存器组 CPU的功能模块 CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和 ...
- SQL-13 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t.CREATE TABLE IF NOT EXISTS "titles" ( ...
- JavaScript+CSS+DIV实现下拉菜单示例
<!DOCTYPE html> <html> <head> <title>下拉菜单示例</title> <script languag ...
- 70 多表查询的分组F 聚合 Q 查询
聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...
- 四、使用汇编编写LED裸机驱动
1. 确定硬件连接 打开OK6410底板电路图,找到LED,可以发现NLEDx为0时LED点亮. 找到LED的控制引脚,发现LED控制引脚通过连接器连到了核心板: 打开核心板电路图,找到对应的连接器中 ...