[日常训练]yayamao的神题
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的神题的更多相关文章
- 算法训练 Hankson的趣味题
算法训练 Hankson的趣味题 时间限制:1.0s 内存限制:64.0MB 问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Han ...
- POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...
- BUAA 724 晴天小猪的神题(RMQ线段树)
BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
- [agc007f] Shik and Copying String 模拟神题
Description "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- AtCoder 神题汇总
记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...
- hdoj5821【贪心-神题】
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...
随机推荐
- 查看数据库表的数据量和SIZE大小的脚本修正
在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误 这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQ ...
- 原生 CSS 网格布局学习笔记
下是来自Oliver Williams的帖子. Oliver已经学习了相当长时间的原生CSS网格,可以说是在CSS网格方面有一定的发言权.在这篇文章中,他将以非同寻常的思路分析自己的CSS网格布局学习 ...
- 解决ntp的错误:no server can be used,exiting
台湾地区一台机器进行时间同步时,出现下面的错误.很显然,它提示的是不能找到主机time.stdtime.gov.tw. 所以我初步猜测是由于dns解析的问题 1 2 3 4 # /usr/sbi ...
- java中System.getenv和System.getProperties的区别
System.getenv获取的是系统的环境变量(就是用户在操作系统中设置的环境变量),windows和linux下环境变量的设置就不说了哦. System.getProperties获取的是系统的相 ...
- openstack命令备忘录
原文http://my.oschina.net/u/138210/blog/142661 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用户 key ...
- ios合并静态库
lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/ ...
- WPF Prism
简介 图解 参考 Using the Model-View-ViewModel Pattern
- [WPF系列]-ListBox
引言 本文就WPF中的ListBox常用项给以实例代码演示,包括隐蔽属性的设置,Style设置,以及ControlTemplate的自定义. Listbox平滑滚动 <ListBox Ite ...
- MIT 6.824 : Spring 2015 lab3 训练笔记
摘要: 源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab3: Paxos-based Key/Value Service Intro ...
- 图像处理工具V1.0
图像处理工具V1.0(仿彗星图片处理工具.VS2015安装界面)----个人无聊作品 以下是界面: 部分代码一.(摘自网络----加水印代码): public static void ImageWat ...