码迷,mamicode.com
首页 > 其他好文 > 详细

类欧几里得

时间:2019-10-06 16:35:05      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:sharp   关联   scan   space   har   inf   std   using   const   

P5170 【模板】类欧几里得算法

技术图片

 

 

 

技术图片

 

 

 技术图片

 

 

 

///类欧几里得的模板题  p5170
//求这三个式子;
//第一个跟后两个没关联
//后两个跟其余两个都有关联;


#include<cstdio>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
const ll inv2=499122177;
const ll inv6=166374059;
const ll mod=998244353;
int t;
ll n,a,b,c;
struct query
{
    ll f;
    ll g;
    ll h;
};
query solve(ll a,ll b,ll c,ll n)
{
    query ans,prec;
    if(a==0){
        ans.f=(b/c)*(n+1)%mod;
        ans.h=(b/c)*n%mod*(n+1)%mod*inv2%mod;
        ans.g=(b/c)*(b/c)%mod*(n+1)%mod;
    }
    else if(a>=c||b>=c){
        prec=solve(a%c,b%c,c,n);
        ans.f=(prec.f+n*(n+1)%mod*inv2%mod*(a/c)%mod+(n+1)*(b/c)%mod)%mod;
        ans.h=((a/c)*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod+
               (b/c)*n%mod*(n+1)%mod*inv2%mod+prec.h)%mod;
        ans.g=(prec.g+(a/c)*(a/c)%mod*n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod+
               (n+1)*(b/c)%mod*(b/c)%mod+2*(a/c)%mod*prec.h%mod+
               2*(b/c)%mod*prec.f%mod+2*(a/c)%mod*(b/c)%mod*n%mod*(n+1)%mod*inv2%mod)%mod;
    }
    else{
        ll m=(a*n+b)/c;
        prec=solve(c,c-b-1,a,m-1);
        ans.f=(n*(m%mod)%mod-prec.f)%mod;
        ans.h=(n*(n+1)%mod*(m%mod)%mod-prec.f-prec.g)%mod*inv2%mod;
        ans.g =(n*(m%mod)%mod*((m+1)%mod)%mod-2*prec.h-2*prec.f-ans.f)%mod;
    }
    return ans;
}
void init()
{
        scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
        query ans=solve(a,b,c,n);
        printf("%lld %lld %lld\n", (ans.f + mod) % mod, (ans.g + mod) % mod, (ans.h + mod) % mod);
    }
}
int main()
{
    init();
    return 0;
}

  

类欧几里得

标签:sharp   关联   scan   space   har   inf   std   using   const   

原文地址:https://www.cnblogs.com/hgangang/p/11627378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!