[日常训练]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 ...
随机推荐
- iOS 实现转盘的效果
效果 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBO ...
- iOS开发之第三方库的学习--hpple的使用
前言:因为在开发中很可能会遇到html解析,如果后台提供的数据只有html数据,或者开发的app需要从web前端的html里获取数据,就需要html解析工具了. 关于HTML解析库,可以阅读:收集几个 ...
- Java导入的项目乱码怎么解决?(Ⅰ)
1.项目右键 打开 >> Properties >> Resource >> Text file encoding >> Other 如 ...
- ORA-01102: cannot mount database in EXCLUSIVE mode
安装完ORACEL 10g数据库后,启动数据库时遇到ORA-01102: cannot mount database in EXCLUSIVE mode [oracle@DB-Server ~]$ s ...
- ORACLE 解锁、找回表和找回程序语句
最近在工作中同事们经常遇到锁表.误删表和程序覆盖的情况,现总结下遇到这三种情况的解决方案: 1.暴力删除锁表 当表被某些语句占用无法停止,或者出现事物阻塞的情况下,需要手动删除锁(万不得已的情况下用) ...
- [python]爬虫学习(一)
要学习Python爬虫,我们要学习的共有以下几点(python2): Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy ...
- Centos7中systemctl命令详解
Linux Systemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syst ...
- 【java开发】分支语句、循环语句学习
一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...
- python 利用 setup.py 手动安装django_chartit
手动安装django_chartit库 1 下载压缩包 2 解压到python安装目录下,文件夹名为django_chartit,并检查文件夹下是否有setup.py文件 3 在cmd中进入djang ...
- JavaScript 基础回顾——对象
JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...