Wannafly挑战赛24 B 222333

小水题???但是时间限制异常鬼畜,跑了2min

\(P | (2^m)*(3^n)-1\)的意思就是\(2^m 3^n = 1 (\text{mod }P)\)

设f[i]表示3^k=i的最小的k

然后枚举2的次幂即可

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int inv,P,ans,ans_m,f[10000010];
il int pow(int x,int y){
    int ret=1;
    while(y){
        if(y&1)ret=1ll*ret*x%P;
        x=1ll*x*x%P;y>>=1;
    }
    return ret;
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("186b.in","r",stdin);
    freopen("186b.out","w",stdout);
#endif
    while(scanf("%d",&P)==1){
        memset(f,63,sizeof f);
        for(ll i=1,j=3;i<P;++i,j=j*3%P)f[j]=std::min(f[j],(int)i);
        ans=1e9;
        inv=pow(2,P-2);
        for(ll i=1,j=inv;i<P;++i,j=j*inv%P)if(i+f[j]<ans)ans=i+f[j],ans_m=i;
        printf("%d %d\n",ans_m,ans-ans_m);
    }
    return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/9737309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值