传送门

此题剧毒,公式恐惧症患者请直接转去代码→_→

前置芝士

基本数论芝士

题解

本题就是要我们求三个函数的值

\[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac{ai+b}{c}\right\rfloor
\]

\[g(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac{ai+b}{c}\right\rfloor^2
\]

\[h(a,b,c,n)=\sum_{i=0}^n i\left\lfloor\frac{ai+b}{c}\right\rfloor
\]

先考虑\(f\),如果\(a\)为\(0\),那么显然$$f(a,b,c,n)=(n+1)\frac{b}{c}$$

根据基本数论芝士,有$$\left\lfloor\frac{ax}{b}\right\rfloor=\left\lfloor\frac{a(x% b)}{b}\right\rfloor+a\left\lfloor\frac{x}{b}\right\rfloor$$

所以,当\(a\geq c\)或\(b\geq c\)时,有$$f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+i\left\lfloor\frac{a}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor$$

\[f(a,b,c,n)=f(a\bmod c,b\bmod c,c,n)+\frac{n(n+1)}{2}\left\lfloor\frac{a}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor
\]

然后考虑\(a<c\)且\(b<c\)的情况

\[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac{ai+b}{c}\right\rfloor
\]

令\(M=\left\lfloor\frac{an+b}{c}\right\rfloor\)

\[f(a,b,c,n)=\sum_{i=0}^n\sum_{j=1}^M \left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geq j\right]
\]

\[f(a,b,c,n)=\sum_{i=0}^n\sum_{j=1}^M \left[ai+b\geq jc\right]
\]

\[f(a,b,c,n)=\sum_{i=0}^n\sum_{j=0}^{M-1} \left[ai+b> jc+c-1\right]
\]

\[f(a,b,c,n)=\sum_{j=0}^{M-1}\sum_{i=0}^n\left[i>\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\right]
\]

\[f(a,b,c,n)=\sum_{j=0}^{M-1}n-\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor
\]

\[f(a,b,c,d)=nM-f(c,c-b-1,a,M-1)
\]

综上,\(f\)就可以递归计算了,

\[f(a,b,c,n)=\begin{cases}(n+1)\lfloor\frac{b}{c}\rfloor&,a=0\\\frac{n(n+1)}{2}\lfloor\frac{a}{c}\rfloor+(n+1)\lfloor\frac{b}{c}\rfloor+f(a\bmod c,b\bmod c,c,n)&,a\ge c\ or\ b\ge c\\nM-f(c,c-b-1,a,M-1),M=\lfloor\frac{an+b}{c}\rfloor &,otherwise\end{cases}
\]

发现这东西是\((a,c)->(c,a)->(c\bmod a,a)\),很像\(\gcd\)的过程,所以这玩意儿的复杂度和\(\gcd\)差不多,都是\(O(\log n)\)

接下来我们要计算\(g,h\),这两个因为有关联所以我们可以放到一起算

当\(a=0\)时,有

\[g(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2
\]

\[h(a,b,c,n)=\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor
\]

然后考虑\(a\geq c\)或者\(b\geq c\)的情况,有

\[g(a,b,c,n)=\sum_{i=0}^n\left(\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+i\left\lfloor\frac{a}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor\right)^2
\]

\[g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor^2+2\left(i\left\lfloor\frac{a}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor\right)\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+\left(i\left\lfloor\frac{a}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor\right)^2
\]

\[g(a,b,c,n)=g(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{a}{c}\right\rfloor h(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{b}{c}\right\rfloor f(a\bmod c,b\bmod c,c,n)+\sum_{i=0}^ni^2\left\lfloor\frac{a}{c}\right\rfloor+2i\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor^2
\]

\[g(a,b,c,n)=g(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{a}{c}\right\rfloor h(a\bmod c,b\bmod c,c,n)+2\left\lfloor\frac{b}{c}\right\rfloor f(a\bmod c,b\bmod c,c,n)+\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor+n(n+1)\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2
\]

然后\(h\)的话就是

\[h(a,b,c,n)=\sum_{i=0}^n i\left(\left\lfloor\frac{(a\bmod c)i+(b\bmod c)}{c}\right\rfloor+i\left\lfloor\frac{a}{c}\right\rfloor+\left\lfloor\frac{b}{c}\right\rfloor\right)
\]

\[h(a,b,c,n)=h(a\bmod c,b\bmod c,c,n)+\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor+\frac{n(n+1)}{2}\left\lfloor\frac{b}{c}\right\rfloor
\]

然后就是\(a<c\)且\(b<c\)的情况,依旧令\(M=\left\lfloor\frac{an+b}{c}\right\rfloor\)

发现\(\left\lfloor\frac{ai+b}{c}\right\rfloor^2\)不好搞,因为有\(x^2=-x+2\sum_{i=1}^x i\),那么就可以继续推倒了

\[g(a,b,c,n)=\sum_{i=0}^n\left(-\left\lfloor\frac{ai+b}{c}\right\rfloor+2\sum_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor} j\right)
\]

\[g(a,b,c,n)=-f(a,b,c,n)+2\sum_{i=0}^n\sum_{j=1}^M j\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]
\]

后面那个东西就和算\(f\)的时候一样搞掉

\[g(a,b,c,n)=-f(a,b,c,n)+2\sum_{j=0}^{M-1}(j+1)(n-\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor)
\]

\[g(a,b,c,n)=-f(a,b,c,n)+nm(m+1)-2h(c,c-b-1,a,M-1)-2f(c,c-b-1,a,M-1)
\]

\(g\)就算好了,然后来算\(h\)

\[h(a,b,c,n)=\sum_{i=0}^ni\sum_{j=1}^M \left[\left\lfloor\frac{ai+b}{c}\right\rfloor\geq j\right]
\]

\[h(a,b,c,n)=\sum_{j=0}^{M-1}\sum_{i=0}^ni\left[i>\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\right]
\]

\[h(a,b,c,n)=\sum_{j=0}^{M-1}\frac{n(n+1)}{2}-\sum_{i=0}^ni\left[i\leq \left\lfloor\frac{jc+c-b-1}{a}\right\rfloor\right]
\]

\[h(a,b,c,n)=\sum_{j=0}^{M-1}\frac{n(n+1)}{2}-\frac{\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor(\left\lfloor\frac{jc+c-b-1}{a}\right\rfloor+1)}{2}
\]

\[h(a,b,c,n)=\frac{1}{2}\left[nm(n+1)-g(c,c-b-1,a,M-1)-f(c,c-b-1,a,M-1) \right]
\]

然后就可以了

\[g(a,b,c,n)=\begin{cases}(n+1)\lfloor\frac{b}{c}\rfloor^2&,a=1\\g(a\bmod c,b\bmod c,c,n)+2\lfloor\frac{a}{c}\rfloor h(a\bmod c,b\bmod c,c,n)+\\2\lfloor\frac{b}{c}\rfloor f(a\bmod c,b\bmod c,c,n)+\frac{n(n+1)(2n+1)}{6}\lfloor\frac{a}{c}\rfloor^2+\\n(n+1)\lfloor\frac{a}{c}\rfloor\lfloor\frac{b}{c}\rfloor+(n+1)\lfloor\frac{b}{c}\rfloor^2&,a\ge c\ or\ b\ge c\\nM(M+1)-f(a,b,c,n)-2h(c,c-b-1,a,M-1)-\\2f(c,c-b-1,a,M-1)&,otherwise\end{cases}
\]

\[h(a,b,c,n)=\begin{cases}\frac{n(n+1)}{2}\lfloor\frac{b}{c}\rfloor&,a=0\\h(a\bmod c,b\bmod c,c,n)+\frac{n(n+1)(2n+1)}{6}\lfloor\frac{a}{c}\rfloor+\frac{n(n+1)}{2}\lfloor\frac{b}{c}\rfloor&,a\ge c\ or\ b\ge c\\\frac{1}{2}[Mn(n+1)-g(c,c-b-1,a,M-1)-f(c,c-b-1,a,M-1)]&,otherwise\end{cases}
\]

递归计算就行了,顺便记得把\(f,g,h\)同步计算

总算写完了→_→

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  8. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  9. using namespace std;
  10. char buf[1<<21],*p1=buf,*p2=buf;
  11. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  12. int read(){
  13. R int res=1,f=1;R char ch;
  14. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  15. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  16. return res*f;
  17. }
  18. char sr[1<<21],z[20];int K=-1,Z=0;
  19. inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
  20. void print(R int x){
  21. if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
  22. while(z[++Z]=x%10+48,x/=10);
  23. while(sr[++K]=z[Z],--Z);sr[++K]=' ';
  24. }
  25. const int P=998244353,inv2=499122177,inv6=166374059;
  26. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  27. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  28. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  29. inline int pow(R int x){return mul(x,x);}
  30. inline int s(R int x){return 1ll*x*(x+1)%P*inv2%P;}
  31. inline int ss(R int x){return 1ll*x*(x+1)%P*((x<<1)+1)%P*inv6%P;}
  32. int ksm(R int x,R int y){
  33. R int res=1;
  34. for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
  35. return res;
  36. }
  37. struct node{int f,g,h;}res;
  38. int n;
  39. node get(int a,int b,int c,int n){
  40. node res;
  41. int x=a/c,y=b/c;
  42. if(!a){
  43. res.f=1ll*y*(n+1)%P;
  44. res.g=1ll*pow(y)*(n+1)%P;
  45. res.h=1ll*y*s(n)%P;
  46. return res;
  47. }
  48. if(a>=c||b>=c){
  49. res=get(a%c,b%c,c,n);
  50. res.g=add(res.g,add(1ll*(x<<1)*res.h%P,add(1ll*(y<<1)*res.f%P,add(1ll*ss(n)*pow(x)%P,add(1ll*n*(n+1)%P*x%P*y%P,1ll*(n+1)*pow(y)%P)))));
  51. res.h=add(res.h,add(1ll*ss(n)*x%P,1ll*s(n)*y%P));
  52. res.f=add(res.f,add(1ll*s(n)*x%P,1ll*(n+1)*y%P));
  53. return res;
  54. }
  55. int M=(1ll*a*n+b)/c;
  56. res=get(c,c-b-1,a,M-1);
  57. int h=res.h,g=res.g,f=res.f;
  58. res.f=dec(1ll*n*M%P,res.f);
  59. res.g=dec(dec(dec(1ll*n*M%P*(M+1)%P,res.f),mul(h,2)),mul(f,2));
  60. res.h=1ll*inv2*dec(dec(1ll*M*n%P*(n+1)%P,g),f)%P;
  61. return res;
  62. }
  63. int main(){
  64. // freopen("testdata.in","r",stdin);
  65. int T=read();
  66. while(T--){
  67. int n=read(),a=read(),b=read(),c=read();
  68. res=get(a,b,c,n);
  69. print(res.f),print(res.g),print(res.h),sr[K]='\n';
  70. }
  71. return Ot(),0;
  72. }

洛谷P5170 【模板】类欧几里得算法(数论)的更多相关文章

  1. 洛谷.4525.[模板]自适应辛普森法1(Simpson积分)

    题目链接 Simpson积分公式:\[\int_a^bf(x)dx\approx\frac{b-a}{6}\left[f(a)+f(b)+4f(\frac{a+b}{2})\right]\] 推导过程 ...

  2. [P5170] 类欧几里得算法

    "类欧几里得算法"第二题 P5170 [题意]已知\(n,a,b,c\),求 \[ \begin{aligned} f_{1}(a,b,c,n)&=\sum_{i=0}^n ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  4. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  5. LOJ138 类欧几里得算法

    类欧几里得算法 给出 \(T\) 组询问,每组用 \(n, a, b, c, k_1, k_2\) 来描述.对于每组询问,请你求出 \[ \sum_{x = 0} ^ {n} x ^ {k_1} {\ ...

  6. Solution -「LOJ #138」「模板」类欧几里得算法

    \(\mathcal{Description}\)   Link.   \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求 \[\sum_{x=0}^nx^{k_1}\left\ ...

  7. Luogu 5170 【模板】类欧几里得算法

    原理不难但是写起来非常复杂的东西. 我觉得讲得非常好懂的博客.   传送门 我们设 $$f(a, b, c, n) = \sum_{i = 0}^{n}\left \lfloor \frac{ai + ...

  8. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  9. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  10. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

随机推荐

  1. Python基础-random模块及随机生成11位手机号

    import random # print(random.random()) # 随机浮点数,默认取0-1,不能指定范围# print(random.randint(1, 20)) # 随机整数,顾头 ...

  2. org.apache.catalina.core.StandardWrapperValve invoke报错

    tomcat报错如下: HTTP Status 404 - Servlet xxx is not available type Status report message Servlet xxx is ...

  3. opensource mcu

    1 OpenVCS - Open Source Video Conferencing Server it is used as Multipoint Control Unit (MCU) manage ...

  4. test20190611 NOIP模拟赛

    题一:答题比赛 [问题描述] YYH报名参加了一个特殊的电视问答节目.这个节目共有n个问题,每回答正确1题,YYH就会获得1分,而每当YYH连续答对k题,那么他的现有得分乘以2,注意答对第k题后,是先 ...

  5. ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1216 题目大意是给了n个数,然后取出两个数,使得xor值最大. 首先暴力枚举是C(n,  ...

  6. jcrop的bug

    1 360(7.1.1.620,内核:31.0.1650.63)的极速模式下,出现裁剪框后,鼠标点击,页面就会滑动到底部. 查看了下源码,发现是下面的代码: function watchKeys() ...

  7. 编写dockerfile

    参考:http://www.cnblogs.com/liuyansheng/p/6098470.html 一.dockerfile介绍: 是一种被Docker程序解释的脚本,Dockerfile由一条 ...

  8. c++11中用_sntprintf代替_stprintf

    sprintf.swprintf 分别是对单字节/双字节字符格式化的,wsprintf根据预定义指示符的不同可以对单字节/双字节字符格式化. wsprintf和swprintf比较,其实这两个函数对用 ...

  9. Python:os.walk()和os.path.walk()用法

    转于:https://www.cnblogs.com/zmlctt/p/4222621.html 博主:zmlctt 一.os.walk() 函数声明:os.walk(top,topdown=True ...

  10. js---复选框(全选,不选,反选)demo1--

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...