Description

$yayamao$是数学神犇,一天他在纸上计算起了$1/P$, 我们知道按照模拟除法可以得到准确解,例如$1/7=0.(142857),1/10=0.1(0)$。$yayamao$发现无论他如何模拟小数都会出现循环,现在$yayamao$想知道循环的长度以及循环出现之前,小数点后面的未循环的数字的位数。例如$1/15=0.0(6)$,那么它的循环长度为$1$,小数点后面的未循环的数字的位数为$1$;$1/4=0.25(0)$,那么它的循环长度为$1$,小数点后面的未循环的数字的位数为$2$。

Input

数据的第一行是一个整数$T$, 表示数据组数。

接下来$T$组数据,每组数据的第一行是一个正整数$P$。

Output

对于每组数据输出$2$个整数$A,B$, 分别表示循环长度以及小数点后面的未循环的数字的位数。

Sample Input

3

1

2

4

Sample Output

1 0

1 1

1 2

HINT

$1\;\leq\;T\;\leq\;10000,1\;\leq\;P\;\leq\;2\;\times\;10^9$.

Solution

小学奥数中,一个分数如果是纯循环小数,则它的分母是$k=999...9$的因数($k$为最小的这种形式的原分母的倍数),循环节为$k$的位数;

若是混循环小数,则它的分母是$k=999...9000...0$的因数($k$为最小的这种形式的原分母的倍数),循环节为$k$中$9$的个数,小数点后不循环部分的位数为$k$中$0$的个数.

由此可见,设$P=2^{a_1}5^{a_2}P'((P',10)=1)$,则循环部分的位数为$max(a_1,a_2)$.

现在求循环节长度.

设$a_i$表示$P'$小数点后$i$位上的数,$b_i$表示处理第$i-1$位后的余数.

显然,$b_1=1,a_1=\lfloor10\;\times\;\frac{1}{P'}\rfloor$,

$b_i=10\;\times\;b_{i-1}\;mod\;P',a_i=\lfloor10\;\times\;\frac{b_i}{P'}\rfloor$.

当找到最小的$p,q(p<q)$满足$b_p=b_q$时,答案为$q-p$.

因为$(P',10)=1$,所以$(P',b_i)=1$.

设$10x\;\equiv\;1(mod\;P')$,若$p\not=1$,则$b_{p-1}=x\;\times\;b_p\;mod\;P'=x\;\times\;b_q\;mod\;P'=b_{q-1}$.

出现了更早的重复$b_{p-1}=b_{q-1}$,所以最早的重复在$p=1$,所以$\frac{1}{P'}$为纯循环小数.

设$y$为最小的满足$b_y=b_1\;\times\;10^{y-1}\;mod\;P'=b_1$的正整数,则$10^{y-1}\;\equiv\;1(mod\;P')$.

问题转化成了求$10$模$P'$的阶.

因为$(10,P')=1$,所以$10^{\phi(P')}\;\equiv\;1(mod\;P')$.

枚举$\phi(P')$的质因数找最小质因数解即可.

#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 45000
using namespace std;
typedef long long ll;
ll m[N];
int f[N],p[N],k,n,x,t,cnt,tot;
bool b[N];
inline void prime(){
f[1]=1;
for(int i=2;i<N;++i){
if(!b[i]){
p[++n]=i;f[i]=i-1;
}
for(int j=1;j<=n&&i*p[j]<N;++j){
b[i*p[j]]=true;
if(!(i%p[j])){
f[i*p[j]]=p[j]*f[i];
break;
}
f[i*p[j]]=(p[j]-1)*f[i];
}
}
}
inline int phi(int k){
if(k<N) return f[k];
for(int i=1,j;i<=n;++i)
if(!(k%p[i])){
j=k/p[i];
if(!(j%p[i]))
return p[i]*phi(j);
return (p[i]-1)*phi(j);
}
return k-1;
}
inline ll mul(int x){
if(x<N) return m[x];
return mul(x>>1)*mul(x+1>>1)%(ll)(k);
}
inline void Aireen(){
scanf("%d",&t);
prime();m[0]=1ll;
while(t--){
scanf("%d",&k);
cnt=tot=0;
while(!(k%2)){
k>>=1;++cnt;
}
while(!(k%5)){
k/=5;++tot;
}
x=phi(k);
for(int i=1;i<N;++i)
m[i]=m[i-1]*10ll%(ll)(k);
for(int i=sqrt(x);i;--i)
if(!(x%i)){
if(mul(i)==1ll) x=min(x,i);
if(mul(x/i)==1ll) x=min(x,x/i);
}
printf("%d %d\n",x,max(cnt,tot));
}
}
int main(){
freopen("pro.in","r",stdin);
freopen("pro.out","w",stdout);
Aireen();
fclose(stdin);
fclose(stdout);
return 0;
}

[日常训练]yayamao的神题的更多相关文章

  1. 算法训练 Hankson的趣味题

    算法训练 Hankson的趣味题   时间限制:1.0s   内存限制:64.0MB        问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Han ...

  2. POJ 2484 A Funny Game(神题!)

    一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...

  3. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

  4. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

  5. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  6. [agc007f] Shik and Copying String 模拟神题

    Description ​ "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...

  7. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  8. AtCoder 神题汇总

    记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...

  9. hdoj5821【贪心-神题】

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...

随机推荐

  1. 查看数据库表的数据量和SIZE大小的脚本修正

    在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误 这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQ ...

  2. 原生 CSS 网格布局学习笔记

    下是来自Oliver Williams的帖子. Oliver已经学习了相当长时间的原生CSS网格,可以说是在CSS网格方面有一定的发言权.在这篇文章中,他将以非同寻常的思路分析自己的CSS网格布局学习 ...

  3. 解决ntp的错误:no server can be used,exiting

    台湾地区一台机器进行时间同步时,出现下面的错误.很显然,它提示的是不能找到主机time.stdtime.gov.tw. 所以我初步猜测是由于dns解析的问题   1 2 3 4 #  /usr/sbi ...

  4. java中System.getenv和System.getProperties的区别

    System.getenv获取的是系统的环境变量(就是用户在操作系统中设置的环境变量),windows和linux下环境变量的设置就不说了哦. System.getProperties获取的是系统的相 ...

  5. openstack命令备忘录

    原文http://my.oschina.net/u/138210/blog/142661 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用户 key ...

  6. ios合并静态库

    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/ ...

  7. WPF Prism

    简介   图解   参考 Using the Model-View-ViewModel Pattern

  8. [WPF系列]-ListBox

    引言 本文就WPF中的ListBox常用项给以实例代码演示,包括隐蔽属性的设置,Style设置,以及ControlTemplate的自定义.   Listbox平滑滚动 <ListBox Ite ...

  9. MIT 6.824 : Spring 2015 lab3 训练笔记

    摘要: 源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab3: Paxos-based Key/Value Service Intro ...

  10. 图像处理工具V1.0

    图像处理工具V1.0(仿彗星图片处理工具.VS2015安装界面)----个人无聊作品 以下是界面: 部分代码一.(摘自网络----加水印代码): public static void ImageWat ...