“类欧几里得算法”第二题 P5170

【题意】已知\(n,a,b,c\),求

\[\begin{aligned}
f_{1}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor\\
f_{2}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor^2\\
f_{3}(a,b,c,n)&=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor*i\\
\end{aligned}
\]

【预备】

设\(m=\lfloor\dfrac{a\times n+b}{c}\rfloor,\ t_{1}=\lfloor\dfrac{a}{c}\rfloor,\ t_{2}=\lfloor\dfrac{b}{c}\rfloor\)。

定义\([\text{expression}]\)为真值表达式。

简单的引理,当\(a,b,c\in Z​\)时

  • \(a\le\lfloor\dfrac{b}{c}\rfloor \Rightarrow ac\le b ​\)。
  • \(a< bc \Rightarrow t_{1}<b\)。

【限界】a=0时直接计算。

【式一】对原式变形

\[f_{1}(a,b,c,n)
=\sum_{i=0}^nt_{1}\times i+t_{2}+\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor\\
=t_{1}\times\dfrac{n(n+1)}{2}+t_{2}\times(n+1)+ f_{1}(a\bmod c,b\bmod c,c,n)
\]

当\(t1=t2=0\)即\(a<c\)且\(b<c\)时,

\[f_{1}(a,b,c,n)=
\sum_{i=0}^n\sum_{j=1}^m [j\le\dfrac{ai+b}{c}]
=\sum_{i=0}^n\sum_{j=1}^m [j\le\lfloor\dfrac{ai+b}{c}\rfloor]\\
=\sum_{j=1}^m\sum_{i=0}^n[j\le\lfloor\dfrac{ai+b}{c}\rfloor]
=\sum_{j=1}^m\sum_{i=0}^n[cj-b\le ai]
=\sum_{j=1}^m\sum_{i=0}^n[cj-b-1< ai]\\
=\sum_{j=1}^m\sum_{i=0}^n[\lfloor\dfrac{cj-b-1}{a}\rfloor< i]
=\sum_{j=1}^m(n-\lfloor\dfrac{cj-b-1}{a}\rfloor)\\
=mn-\sum_{i=1}^m\lfloor\dfrac{ci-b-1}{a}\rfloor
=mn-\sum_{i=0}^{m-1}\lfloor\dfrac{ci+c-b-1}{a}\rfloor\\
=mn-f_{1}(c,c-b-1,a,m-1)
\]

【式二】对原式变形

\[f_{2}(a,b,c,n)
=\sum_{i=0}^n(t_{1}\times i+t_{2}+\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor)^2\\
=\sum_{i=0}^n \begin{cases}
(t_{1}\times i)^2+t_{2}^2+\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor^2\\
+2t_{1}t_{2}*i\\
+2t_{1}i\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor\\
+2t_{2}\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor
\end{cases}\\
=\begin{cases}
t_{1}^2\sum_{i=0}^ni^2+t_{2}^2*(n+1)+f_{2}(a\bmod c,b\bmod c,c,n)\\
+2t_{1}t_{2}\sum_{i=0}^n i\\
+2t_{1}f_{3}(a\bmod c,b \bmod c,c,n)\\
+2t_{2}f_{1}(a\bmod c,b \bmod c,c,n)
\end{cases}\\
\]

当\(t1=t2=0\)即\(a<c\)且\(b<c​\)时,

\[f_{2}(a,b,c,d)=
\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor
=\sum_{i=0}^n\sum_{j=1}^m\sum_{k=1}^m[\lfloor\dfrac{cj-b-1}{a}\rfloor< i\text{ and }\lfloor\dfrac{ck-b-1}{a}\rfloor< i]\\
=\sum_{i=0}^n\sum_{j=1}^m\sum_{k=1}^m [\max(\lfloor\dfrac{cj-b-1}{a}\rfloor,\lfloor\dfrac{ck-b-1}{a}\rfloor)< i]\\
=\sum_{j=1}^m\sum_{k=1}^m \sum_{i=0}^n[\max(\lfloor\dfrac{cj-b-1}{a}\rfloor,\lfloor\dfrac{ck-b-1}{a}\rfloor)< i]\\
=\sum_{j=1}^m\sum_{k=1}^m n-\max(\lfloor\dfrac{cj-b-1}{a}\rfloor,\lfloor\dfrac{ck-b-1}{a}\rfloor)\\
=nm^2-\sum_{j=1}^m\sum_{k=1}^m\max(\lfloor\dfrac{cj-b-1}{a}\rfloor,\lfloor\dfrac{ck-b-1}{a}\rfloor)\\
=nm^2-2*\sum_{j=1}^m\lfloor\dfrac{cj-b-1}{a}\rfloor*(j-1)-\sum_{j=1}^m \lfloor\dfrac{cj-b-1}{a}\rfloor\\
=nm^2-\sum_{j=0}^{m-1} \lfloor\dfrac{cj+c-b-1}{a}\rfloor*j-\sum_{j=0}^{m-1} \lfloor\dfrac{cj+c-b-1}{a}\rfloor\\
=nm^2-f_{1}(c,c-b-1,a,m-1)-2*f_{3}(c,c-b-1,a,m-1)
\]

【式三】对原式变形

\[f_{3}(a,b,c,n)=\sum_{i=0}^n\lfloor\dfrac{ai+b}{c}\rfloor*i
=\sum_{i=0}^n (t_{1}\times i+t_{2}+\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor)*i\\
=\sum_{i=0}^n t_{1}\times i^2+t_{2}\times i+\lfloor\dfrac{(a\bmod c)\times i+(b\bmod c)}{c}\rfloor\times i\\
=t_{1}\sum_{i=0}^ni^2+t_{2}\sum_{i=0}^ni+f_{3}(a\bmod c,b\bmod c,c,n)
\]

当\(t1=t2=0\)即\(a<c\)且\(b<c\)时,定义\(p(j)=\lfloor\dfrac{cj-b-1}{a}\rfloor\)。

\[f3(a,b,c,d)
=\sum_{i=0}^n\sum_{j=1}^m [j\le\lfloor\dfrac{ai+b}{c}\rfloor]*i
=\sum_{j=1}^m\sum_{i=0}^n[\lfloor\dfrac{cj-b-1}{a}\rfloor< i]*i\\
=\sum_{j=1}^m\sum_{i=p(j)+1}^ni
=\sum_{j=1}^m \dfrac{1}{2}(p(j)+1+n)(n-p(j))\\
=\sum_{j=1}^m \dfrac{1}{2}(n\times p(j)-p^2(j)+n-p(j)+n^2-n\times p(j))\\
=\sum_{j=1}^m \dfrac{1}{2}(-p^2(j)+n-p(j)+n^2)\\
=\dfrac{-f_{2}(c,c-b-1,a,m-1)-f_{1}(c,c-b-1,a,m-1)+nm+n^2m}{2}
\]

【时间复杂度】如果每个都单独搜索的话,大概因该会炸吧。。考虑到三个函数的递归模式都很**,干脆用一个结构体存下三个值。再参考第一题的分析,状态数目是\(\log\)级别的。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod=998244353;
const LL I2=499122177;
const LL I6=166374059; inline LL s1(LL n) {return I2*n%mod*(n+1)%mod;}
inline LL s2(LL n) {return I6*n%mod*(n+1)%mod*(n+n+1)%mod;} struct node {
LL f1,f2,f3;
node(LL f1=0,LL f2=0,LL f3=0):f1(f1),f2(f2),f3(f3){
// assert(0<=f1 && 0<=f2 && 0<=f3);
// assert(f1<mod && f2<mod && f3<mod);
}
};
node dfs(LL a,LL b,LL c,LL n) {
if(!a||!n) return node(
(b/c)*(n+1)%mod,
(b/c)*(b/c)%mod*(n+1)%mod,
(b/c)*s1(n)%mod
);
if(a>=c || b>=c) {
LL t1=a/c, t2=b/c;
node tmp=dfs(a%c,b%c,c,n);
return node(
(t1*s1(n)%mod+t2*(n+1)%mod+tmp.f1)%mod,
(t1*t1%mod*s2(n)%mod
+t2*t2%mod*(n+1)%mod
+tmp.f2
+2*t1%mod*t2%mod*s1(n)%mod
+2*t1%mod*tmp.f3%mod
+2*t2%mod*tmp.f1%mod
)%mod,
(t1*s2(n)%mod+t2*s1(n)%mod+tmp.f3)%mod
);
} else {
LL m=(a*n+b)/c;
node tmp=dfs(c,c-b-1,a,m-1);
return node(
(n*m%mod-tmp.f1+mod)%mod,
(n*m%mod*m%mod-tmp.f1-2*tmp.f3%mod+mod+mod)%mod,
(n*m%mod+n*n%mod*m%mod-tmp.f1-tmp.f2+mod+mod)%mod*I2%mod
);
}
} int main() {
int T,a,b,c,n;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d%d",&n,&a,&b,&c);
node tmp=dfs(a,b,c,n);
printf("%lld %lld %lld\n",tmp.f1,tmp.f2,tmp.f3) ;
}
return 0;
}

[P5170] 类欧几里得算法的更多相关文章

  1. LOJ138 类欧几里得算法

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

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

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

  3. Solution -「Luogu 5170」类欧几里得算法

    推柿子大赛了属于是. 题目要求三个柿子,不妨分别记为: \[\begin {align} f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloo ...

  4. BZOJ3817 Sum(类欧几里得算法)

    设$t=\sqrt r$,原题转化为$\sum_{x=1}^n(4*\lfloor\frac{tx}2\rfloor-2*\lfloor tx\rfloor+1)$考虑如何求$\sum_{x=1}^n ...

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

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

  6. 洛谷P5170 【模板】类欧几里得算法(数论)

    传送门 此题剧毒,公式恐惧症患者请直接转去代码→_→ 前置芝士 基本数论芝士 题解 本题就是要我们求三个函数的值 \[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac ...

  7. [BZOJ2987]Earthquake:类欧几里得算法

    分析 类欧的式子到底是谁推的啊怎么这么神仙啊orz! 简单说一下这道题,题目中的约束条件可以转化为: \[ y \leq \frac{c-ax}{b} \] 有负数怎么办啊?转化一下: \[ y \l ...

  8. 【LuoguP4433】[COCI2009-2010#1] ALADIN(含类欧几里得算法推导)

    题目链接 题意简述 区间赋值模意义下等差数列,询问区间和 \(N\leq 10^9,Q\leq 10^5\) Sol 每次操作就是把操作区间\([L,R]\)中的数赋值成: \[(X-L+1)*A\ ...

  9. python常用算法(6)——贪心算法,欧几里得算法

    1,贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解. 贪心算法并不保证会得到最优解,但 ...

随机推荐

  1. 一个小工具,利用php把指定目录文件递归上传到阿里云OSS

    cp2oss(_GALLERY_DIR); function cp2oss($directory) { $mydir = dir($directory); while($file = $mydir-& ...

  2. shell逻辑运算总结, 包括[[]]与[]的区别,&&与-a的区别,||与-o的区别

    1. 关于文件和目录 -f  判断某普通文件是否存在 -d  判断某目录是否存在 -b  判断某文件是否块设备 -c  判断某文件是否字符设备 -S  判断某文件是否socket(待修正) -L  判 ...

  3. jieba库的使用和好看的词元

    一.jieba库的使用与说明 1.jieba库基本介绍 jieba库是优秀的中文分词第三方库 -中文文本需要通过分词获得单个的词语         - jieba是优秀的中文分词第三方库,需要额外安装 ...

  4. JAVA 8 主要新特性 ----------------(七)新时间日期 API -----Instant 时间戳

    一.简介 用于“时间戳”的运算.它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算 二.文档介绍 1.now Instant instantNow = ...

  5. nginx server

    配置nginx 首先apt install nginx 然后安装php apt-get install php7.0-fpm php7.0-mysql php7.0-common php7.0-mbs ...

  6. 通过HttpClient发起Get请求,获取Json数据,然后转为java数据,然后批量保存数据库;

    Json转java所需Jar包: commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.5.jar,comm ...

  7. 使用java开发spark的wordcount程序(多种实现)

    package spark; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; impo ...

  8. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  9. Core Expression

    https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm A Cron Expressions Cro ...

  10. python装饰器同时支持有参数和无参数的练习题

    ''' 预备知识: …… @decorator def f(*args,**kwargs): pass # 此处@decorator  等价于 f = decorator(f) @decorator2 ...