类欧几里得推导
求
若或者,令
就转化成了的情况
考虑的情况:
令
复杂度
从几何意义讲,表示的是下的整数点
类似地,
的情况:
的情况:
cpp
struct FloorSum{
static constexpr int MOD=998244353,inv2=499122177,inv6=166374059;
struct Node{
int f=0,g=0,h=0;
};
int mo(int x){return x>=MOD?x-MOD:x;}
int sqr(int x){return 1ll*x*x%MOD;}
Node f(int a,int b,int c,int n){
Node res;
if(!a){
res.f=1ll*b/c*n%MOD;
res.g=1ll*n*(n-1)/2%MOD*(b/c)%MOD;
res.h=1ll*sqr(b/c)*n%MOD;
}
else if(a>=c||b>=c){
Node o=f(a%c,b%c,c,n);
res.f=(o.f+1ll*n*(n-1)/2%MOD*(a/c)+1ll*b/c*n)%MOD;
res.g=(o.g+1ll*a/c*n%MOD*(n-1)%MOD*(n*2-1)%MOD*inv6+1ll*n*(n-1)/2%MOD*(b/c))%MOD;
res.h=(o.h+2ll*(a/c)*o.g+2ll*(b/c)*o.f+1ll*n*(n-1)%MOD*(n*2-1)%MOD*inv6%MOD*sqr(a/c)+1ll*n*(n-1)%MOD*(a/c)%MOD*(b/c)+1ll*n*sqr(b/c))%MOD;
}
else{
int m=(1ll*a*(n-1)+b)/c;
Node o=f(c,c-b-1,a,m);
res.f=(1ll*(n-1)*m-o.f+MOD)%MOD;
res.g=((1ll*m*n%MOD*(n-1)-o.h-o.f)%MOD+MOD)*inv2%MOD;
res.h=(1ll*(n-1)*m%MOD*m-mo(o.g*2)-o.f+MOD+MOD)%MOD;
}
return res;
}
};
void solve(){
FloorSum f;
int a,b,c,n;
cin>>n>>a>>b>>c;
auto res=f.f(a,b,c,n+1);
cout<<res.f<<" "<<res.h<<" "<<res.g<<"\n";
}