| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38740 | LYLAKIOIAKIOI | 【BJ】T3 | C++ | 通过 | 100 | 33 MS | 288 KB | 2099 | 2025-10-21 21:31:28 |
#include<bits/stdc++.h> #define ll long long #define i128 __int128_t using namespace std; const int mod=998244353; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} int qp(int a,ll b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } int mulv; struct Node{ int U,R,PW,SPW,SUM,SUM2; Node(){U=0,R=0,PW=1,SPW=0,SUM=0,SUM2=0;} Node(int _U,int _R,int _PW,int _SPW,int _SUM,int _SUM2){U=_U,R=_R,PW=_PW,SPW=_SPW,SUM=_SUM,SUM2=_SUM2;} Node operator+(const Node &b){ return Node( (U+b.U)%mod, (R+b.R)%mod, 1ll*PW*b.PW%mod, (SPW+1ll*b.SPW*PW)%mod, (SUM+(b.SUM+1ll*b.SPW*U)%mod*PW)%mod, (SUM2+(b.SUM2+1ll*b.SPW*R)%mod*PW)%mod); } };Node up,rt; Node fadd(Node a,ll b){ Node x=Node(); while(b){ if(b&1) x=x+a; b>>=1;a=a+a; }return x; } //(px+r)/q U->A R->B Node calc(ll p,ll q,ll r,ll n,Node A,Node B){ if(n==0) return Node(); if(p>=q) return calc(p%q,q,r,n,A,fadd(A,p/q)+B); ll m=((i128)(p)*n+r)/q; if(m==0) return fadd(B,n); return fadd(B,(q-r-1)/p)+A+calc(q,p,(q-r-1)%p,m-1,B,A)+fadd(B,n-((i128)(q)*m-r-1)/p); } ll n,k,p; int calcans(int val){ int pw=qp(mod+1-p,k);n%=mod; //cout<<"tmp:"<<1ll*(1ll*(1ll*val*p)%mod*qp(mod+1-pw,mod-2))%mod*qp(n,mod-2)%mod<<endl; return 1ll*(1ll*(1ll*val*p+1ll*n*n%mod*pw)%mod*qp(mod+1-pw,mod-2))%mod*qp(n,mod-2)%mod; } void slv(){ cin>>n>>k>>p; int iv=qp(p,mod-2); up=Node(1,0,(mod+1-p)%mod,0,0,0);rt=Node(0,1,1,1,0,1); Node res=calc(k,n,k-1,n-1,up,rt);res.SPW=(res.SPW+1)%mod; int val=1ll*(n%mod)*iv%mod*(mod+n%mod-res.SPW)%mod; val=(val+1ll*k%mod*(res.SUM2+res.SPW))%mod; val=(val+mod-1ll*n%mod*res.SUM%mod)%mod; val=mod-val;val=(val+1ll*n%mod*(n%mod+1)%mod*(mod+1-qp(mod+1-p,k))%mod*iv)%mod; cout<<calcans(val)<<endl; } int main(){ //freopen("sun.in","r",stdin); //freopen("sun.out","w",stdout); int t;cin>>t; while(t--) slv(); return 0; }