首先,必然要有$(a+ci)-(a+bi)+1<d$,因此$(c-b)i\le d-2$,即$i\le \lfloor\frac{d-2}{c-b}\rfloor$

此时,$[a+bi,a+ci]$中不存在$d$的倍数,当且仅当$\lfloor\frac{a+bi-1}{d}\rfloor=\lfloor\frac{c+bi}{d}\rfloor$,同时两者之差不大于2,因此可以通过求和来统计,即$n-\sum_{i=1}^{n}\lfloor\frac{a+ci}{d}\rfloor-\lfloor\frac{a+bi-1}{d}\rfloor$(其中$n=\lfloor\frac{d-2}{c-b}\rfloor$)

这两个式子是类似的,因此可以仅考虑$\sum_{i=1}^{n}\lfloor\frac{a+ci}{d}\rfloor$

将后者用1累加的形式来表示,即$\sum_{i=1}^{n}\sum_{1\le j\le \lfloor\frac{a+ci}{d}\rfloor}1$

调换枚举顺序,令$n'=\lfloor\frac{a+cn}{d}\rfloor$,因此即$\sum_{j=1}^{n'}\sum_{1\le i\le n,j\le \lfloor\frac{a+ci}{d}\rfloor}1$

考虑$j\le \lfloor\frac{a+ci}{d}\rfloor$,改为用$j$来限制$i$,即$\lceil\frac{jd-a}{c}\rceil=\lfloor\frac{jd-a+c-1}{c}\rfloor\le i\le n$

同时注意到$a<d$且$j\ge 1$,即保证了$\lfloor\frac{jd-a+c-1}{c}\rfloor\ge 1$

再将后者1的累加展开,即$\sum_{j=1}^{n'}n-\lfloor\frac{jd-a+c-1}{c}\rfloor+1=n'(n+1)-\sum_{j=1}^{n'}\lfloor\frac{(c-a-1)+jd}{c}\rfloor$

因此,即记$f(n,a,c,d)=\sum_{i=1}^{n}\max(\lfloor\frac{a+ci}{d}\rfloor,0)$,则$f(n,a,c,d)=n'(n+1)-f(n',c-a-1,d,c)$

另外,$f(n,a,c,d)$还有以下变换来规范其形式,即:

1.若$a\ge d$,$f(n,a,c,d)=f(n,a\ mod\ d,c,d)+\lfloor\frac{a}{d}\rfloor n$

2.若$a<0$,$f(n,a,c,d)=f(n,a+kd,c,d)-kn$(其中$k=\lfloor\frac{-a+d-1}{d}\rfloor$)

3.若$c\ge d$,$f(n,a,c,d)=f(n,a,c\ mod\ d,d)+\lfloor\frac{c}{d}\rfloor{n+1\choose 2}$

4.若$c=0$,$f(n,a,c,d)=0$

注意到其关于$(c,d)$的变换形式与扩展欧几里得相同,因此复杂度为$o(\log_{2}d)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 int t,a,b,c,d;
5 ll n;#include<bits/stdc++.h>
6 using namespace std;
7 #define ll long long
8 int t,a,b,c,d;
9 ll n;
10 ll f(ll n,int a,int c,int d){
11 if (a>=d)return f(n,a%d,c,d)+(a/d)*n;
12 if (a<0){
13 int k=(-a+d-1)/d;
14 return f(n,a+k*d,c,d)-k*n;
15 }
16 if (c>=d)return f(n,a,c%d,d)+(n+1)*n/2*(c/d);
17 if (!c)return 0;
18 ll nn=(a+c*n)/d;
19 return nn*(n+1)-f(nn,c-a-1,d,c);
20 }
21 int main(){
22 scanf("%d",&t);
23 while (t--){
24 scanf("%d%d%d%d",&a,&b,&c,&d);
25 n=(d-2)/(c-b);
26 printf("%lld\n",n-f(n,a,c,d)+f(n,a-1,b,d));
27 }
28 }
29 ll f(ll n,int a,int c,int d){
30 if (a>=d)return f(n,a%d,c,d)+(a/d)*n;
31 if (a<0){
32 int k=(-a+d-1)/d;
33 return f(n,a+k*d,c,d)-k*n;
34 }
35 if (c>=d)return f(n,a,c%d,d)+(n+1)*n/2*(c/d);
36 if (!c)return 0;
37 ll nn=(a+c*n)/d;
38 return nn*(n+1)-f(nn,c-a-1,d,c);
39 }
40 int main(){
41 scanf("%d",&t);
42 while (t--){
43 scanf("%d%d%d%d",&a,&b,&c,&d);
44 n=(d-2)/(c-b);
45 printf("%lld\n",n-f(n,a,c,d)+f(n,a-1,b,d));
46 }
47 }

[atARC111E]Simple Math 3的更多相关文章

  1. hdu 1757 A Simple Math Problem (乘法矩阵)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. HDU1757 A Simple Math Problem 矩阵快速幂

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. hdu------(1757)A Simple Math Problem(简单矩阵快速幂)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. FZYZ-2071 A Simple Math Problem IX

    P2071 -- A Simple Math Problem IX 时间限制:1000MS      内存限制:262144KB 状态:Accepted      标签:    数学问题-博弈论    ...

  5. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  6. HDU 1757 A Simple Math Problem (矩阵快速幂)

    题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...

  7. HDU 1757 A Simple Math Problem(矩阵)

    A Simple Math Problem [题目链接]A Simple Math Problem [题目类型]矩阵快速幂 &题解: 这是一个模板题,也算是入门了吧. 推荐一个博客:点这里 跟 ...

  8. HDU 1757 A Simple Math Problem (矩阵乘法)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. hdu 5974 A Simple Math Problem

    A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

随机推荐

  1. Linux Bash命令杂记(tr col join paste expand)

    Linux Bash命令杂记(tr col join paste expand) tr命令 tr命令可以将输入的数据中的某些字符做替换或者是作删除 tr [-ds] STR d: 删除输入数据的中的S ...

  2. 在浏览器上开发GO和Vue!(基于code-server)

    在浏览器上开发GO和Vue!(基于code-server) 曾几何时,开发者们都被安装编程环境苦恼,尽管现在很多语言的开发环境已经不难装了,但是如果我们能有一个运行在云端的编译器,那么我们就可以随时随 ...

  3. Noip模拟47 2021.8.25

    期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...

  4. 关于QGIS的插件开发(C++)

    关于C++插件的开发材料较少,根据网上的指导,我采用了早期版本的插件模板生成的方法来创建QGIS的插件,其方法是从以前版本(2.18.25)里面拷贝插件模板的方法进行,具体的执行步骤为 1.拷贝文件 ...

  5. 使用 ASP.NET Core 3.1 的微服务开发指南

    使用 ASP.NET Core 3.1 的微服务 – 终极详细指南 https://procodeguide.com/programming/microservices-asp-net-core/ A ...

  6. hdu 1166 敌兵布阵(单点更新,区间查询)

    题意: N个工兵营地.工兵营地里的人数分别为:a1,a2,....aN Add i,j:第i个工兵营地里增加j人 Sub i,j:第i个工兵营地里减少j人 Query i,j:查询第i个第j个工兵营地 ...

  7. 第07课 OpenGL 光照和键盘(1)

    光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...

  8. Gitee图床设置

    https://gitee.com/ 创建新仓库 点击右上角加号->新建仓库,填写基本信息后点击下面的创建即可 https://gitee.com/projects/new 创建新令牌 点击设置 ...

  9. Tomcat 内存马(二)Filter型

    一.Tomcat处理请求 在前一个章节讲到,tomcat在处理请求时候,首先会经过连接器Coyote把request对象转换成ServletRequest后,传递给Catalina进行处理. 在Cat ...

  10. 开发属于自己的包,并上传到npm上

    1.DIY开发包 1.1符合标准的包结构 一个规范的包,它的组成结构,必须符合以下3点要求: 包必须以单独的目录而存在 包的顶级目录下,必须包含package.json这个包管理文件 package. ...