NOIP 2021全国排位赛 A. 基础数论练习题

【题意】

 

 【分析】

 

 

 

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll p,a,b,ans,M;
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll divide(ll a,ll b)
{
    if(b<a) return 0;
    ll inv=qpow(qpow(2,a),mod-2);
    // printf("%d %d\n",(1+mod-qpow(inv,b/a))*qpow(2,b-a)%mod*qpow(mod+1-inv,mod-2)%mod,(b/a)*qpow(p,a%b)%mod);
    return (1+mod-qpow(inv,b/a))*qpow(2,b-a)%mod*qpow(mod+1-inv,mod-2)%mod;
    // return (b/a)*qpow(p,a%b)%mod;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1; y=0; return;
    }
    exgcd(b,a%b,x,y);
    ll z=x;
    x=y;
    y=(z-divide(b,a)*x%mod)%mod;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%lld%lld%lld",&p,&a,&b);
    if(p>2 || __gcd(a,b)>1)
    {
        printf("-1");
        return 0;
    }
    ll x,y;
    exgcd(a,b,x,y);
    // printf("[%lld]\n",x);
    b=qpow(2,b)-1;
    if(x<0) x+=b;
    x=(x%mod+mod)%mod;
    printf("%lld\n",x);
    return 0;
}

 

posted @ 2021-11-18 18:46  andyc_03  阅读(31)  评论(0编辑  收藏  举报