首先,必然要有$(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. keeplived高可用配置

    前提:关闭防火墙,关闭selinux 1.主备配置 主 vim keeplived-lb01.confglobal_defs { router_id LVS_01 } vrrp_instance VI ...

  2. docker中Jenkins启动无法安装插件,版本过低

    一.问题现象: 使用docker启动jenkins,在jenkins启动后却无法安装jenkins的插件,一直提示安装失败且从log看到提示信息显示为需要升级jenkins的版本 二.原因分析: 在使 ...

  3. 2021-5-15 vj补题

    C - Win or Freeze CodeForces - 151C 题目内容: You can't possibly imagine how cold our friends are this w ...

  4. C chdir函数

    chdir微软官方文档 在制作小游戏时遇到的问题:图片音频等资源文件太多,和exe同一个目录不方便集中管理 整理方案1 首先创建了一个名为"resource"的文件夹,把程序执行过 ...

  5. MIPS指令 MIPS架构

    华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...

  6. 升级更新 Windows10

    升级更新 Windows10:获取 Windows 更新助手 升级 Windows10,它是先下载 Windows10 系统镜像,然后才升级.在下载完 Windows10 后,升级前,有一步骤会询问: ...

  7. 【二食堂】Alpha - Scrum Meeting 4

    Scrum Meeting 4 例会时间:4.14 12:30 - 12:50 进度情况 组员 昨日进度 今日任务 李健 1. 主页面的搭建工作issue 1. 完成主页搭建**issue2. 与后端 ...

  8. BUAAOO第四单元总结

    ---恢复内容开始--- 一.本单元两次作业的架构设计 第十三次作业:本次作业我创建了四个类,除去官方提供的Main和MyUmlInteraction类之外,还有Uclass和Ulinterface分 ...

  9. 期望 概率DP

    期望 \(x\) 的期望 \(E(x)\) 表示平均情况下 \(x\) 的值. 令 \(C\) 表示常数, \(X\) 和 \(Y\) 表示两个随机变量. \(E(C)=C\) \(E(C \time ...

  10. 原串反转 牛客网 程序员面试金典 C++ Python

    原串反转 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniS ...