牛客周赛round6 T5题解

首先假设 和10互质,那么根据欧拉定理可以得出 一定是的倍数,也就是说必然是的一个循环节(举例,,所以999999一定是7的倍数,999999/7=142857,那么1/7一定是0.142857142857……的循环)。因此最小循环节必然是的因子。我们只需要枚举的每个因子,用快速幂检验一下因子是否满足即可。

对于 和10不互质的情况,我们可以将p乘一个10的幂,和的2或者5的因子约掉后即可满足和10互质了。带来的影响则是等号右边的小数点左移,即产生了“循环节前面的部分”。因此,循环节前面的部分即中2或5的最大因子数。

参考代码:

#include<bits/stdc++.h>
using namespace std;
long long phi(long long x){
    long long i;
    long long res=x;
    for(i=2;i*i<=x;i++){
        if(x%i==0){
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)res=res/x*(x-1);
    return res;
}
long long power(__int128 a,long long b,long long p){
    __int128 res=1;
    while(b){
        if(b&1)res=res*a%p;
        b>>=1;
        a=a*a%p;
    }
    return res;
}
int main(){
    long long p,q,i,c2=0,c5=0;
    cin>>p>>q;
    q/=__gcd(p,q);
    while(q%2==0)q/=2,c2++;
    while(q%5==0)q/=5,c5++;
    if(q==1)return cout<<-1,0;
    long long temp=phi(q);
    long long mi=1e16;
    for(i=1;i*i<=temp;i++){
        if(temp%i==0){
            if(power(10,i,q)==1)mi=min(mi,i);
            if(power(10,temp/i,q)==1)mi=min(mi,temp/i);  
        }
    }
    cout<<max(c2,c5)<<' '<<mi;
}
全部评论
为什么是循环节以及为什么最小循环节是phi(q)的因子没说清楚呢。
点赞 回复 分享
发布于 2023-08-06 22:30 湖南

相关推荐

01-17 12:35
吉首大学 Java
秋招之BrianGriffin:自己的工作自己做!😡
点赞 评论 收藏
分享
KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务