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; }