传送门

文章目录

  • 题意
  • 思路:

题意

给定一个不同数组成的序列aaa,定义pkp_kpk​为pk=∑i=1k∑j=1kaimodajp_k=\sum_{i=1}^k\sum_{j=1}^ka_i\bmod a_jpk​=∑i=1k​∑j=1k​ai​modaj​,让你对于每个i∈[1,n]i\in [1,n]i∈[1,n]求出pip_ipi​。

2≤n≤2e5,1≤ai≤3e52\le n\le 2e5,1\le a_i\le 3e52≤n≤2e5,1≤ai​≤3e5

思路:

考虑每次新增了什么,不难发现从pi−1p_{i-1}pi−1​到pip_ipi​新增了∑j=1iaimodaj+∑j=1iajmodai\sum_{j=1}^i a_i\bmod a_j+\sum_{j=1}^ia_j\bmod a_i∑j=1i​ai​modaj​+∑j=1i​aj​modai​。

对于这俩式子的不取模的时候贡献,第一个是查询[1,i−1][1,i-1][1,i−1]中大于aia_iai​的值的个数再乘上aia_iai​,第二个是查询[1,i−1][1,i-1][1,i−1]中小于aia_iai​的值的和。

对于第二个式子,aia_iai​固定,我们考虑枚举aia_iai​的倍数,对应[0,ai),[ai,2∗ai),...[0,a_i),[a_i,2*a_i),...[0,ai​),[ai​,2∗ai​),...,我们还是查询区间和,让后减去k∗aik*a_ik∗ai​即可,其中kkk是有几个aia_iai​。

对于第一个,我们考虑将其化简一下,aimodaj=ai−aj∗⌊aiaj⌋a_i\bmod a_j=a_i-a_j*\left \lfloor \frac{a_i}{a_j} \right \rfloorai​modaj​=ai​−aj​∗⌊aj​ai​​⌋,对于后面的下取整的式子我们显然可以直接整除分块,但是这样会t掉。。

直接考虑贡献不好弄,我们考虑对于每个aia_iai​,我们将其对其他数的贡献存下来,也就是我们依旧枚举aia_iai​的倍数,将ai,2∗ai,...a_i,2*a_i,...ai​,2∗ai​,...的位置都加上aia_iai​,此时只需要查询[1,ai][1,a_i][1,ai​]的和即可,贡献都已经放到里面了。

// Problem: F. Pairwise Modulo
// Contest: Codeforces - Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
// URL: https://codeforces.com/problemset/problem/1553/F
// Memory Limit: 256 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=600010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N];
struct BIT {LL tr[N];#define lowbit(x) (x&(-x))void add(int x,int c) {while(x<N) tr[x]+=c,x+=lowbit(x);}LL sum(int x) {if(x<=0) return 0ll;LL ans=0;// while(x) ans+=tr[x],x-=lowbit(x);for(int i=x;i;i-=lowbit(i)) ans+=tr[i];return ans;}}tr1,tr2,tr3;int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);LL ans=0,mx=*max_element(a+1,a+1+n);for(int i=1;i<=n;i++) {for(int j=0,k=a[i]-1;k<=mx*2;j++,k+=a[i]) {LL all=tr1.sum(k)-tr1.sum(max(k-a[i],0));ans+=all;ans-=1ll*j*a[i]*(tr2.sum(k)-tr2.sum(max(k-a[i],0)));}ans+=1ll*a[i]*(i-1);ans-=tr3.sum(a[i]);for(int j=a[i];j<=mx;j+=a[i]) tr3.add(j,a[i]);// for(int l=1,r;l<=a[i];l=r+1) {// r=a[i]/(a[i]/l);// int now=a[i]/l;// ans-=1ll*now*(tr1.sum(r)-tr1.sum(l-1));// }tr1.add(a[i],a[i]);tr2.add(a[i],1);printf("%lld ",ans);}puts("");return 0;
}
/**/

Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组相关推荐

  1. CodeForces - 1553F Pairwise Modulo(数论+树状数组)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求 pk=∑1≤i,j≤kaimodajp_k = \sum_{1 \le i, j \le k} a_i \bmod a_jpk​=∑1 ...

  2. Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)

    Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) 题号 题目 知识点 A ...

  3. Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝

    传送门 文章目录 题意: 思路: 题意: 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n],你可以选择一个kkk,将这个排列循环右移kkk次,让后最多交换 ...

  4. Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)(A - D)

    A 太简单了,写完就删了 B 有很多人暴力搜,或者其他方法,样例不严谨过了,然后就被hack了 #include<bits/stdc++.h> #define int long long ...

  5. Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) -29

    自闭场,d题fst了,掉大分^^ A 题意 如果数字x的各个位数加和比x+1的大,称为一个特殊数字,问给出n,小于等于n的特殊数字个数 A 思路 这能wa1,我真服了..显然只有9,19,29,等等尾 ...

  6. Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set

    题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...

  7. codeforces 7.22 F Pairwise Modulo

    codeforces 7.22 F Pairwise Modulo 给出n个数的数列a,每个数互不相同且都小于3e5,求出qk=∑1<=i,j<=kaimodajq_k=\sum_{1&l ...

  8. codeforces1553 F. Pairwise Modulo(数学)

    F. Pairwise Modulo 想到了,但又没完全想到..wtcl 首先 pk=pk−1+∑1≤i<kakmodai+∑1≤i<kaimodakp_k=p_{k-1}+\sum_{1 ...

  9. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. 备份恢复文件夹NTFS安全设置
  2. uva 129 回溯法入门
  3. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL
  4. Effective Java之谨慎地使用本地方法(五十四)
  5. 『ACM-算法-二分法』算法竞赛进阶指南--在单调递增序列a中查找大于等于X的数中最小的一个,即X或X的后继
  6. Tracking 的SimTrack 以及 4D seg
  7. 网曝Facebook中国员工跳楼身亡,总部态度冷漠,华人群体抗议:为死者讨回公道...
  8. Ubuntu16.04下禁用scp、sftp和winscp
  9. Ubuntu18.04 如何解决编译objective-c出现undefined reference to objc_get_class
  10. 自动控制原理复习——第二章 控制系统的数学模型,系统框图简化,信号流图,梅森公式,控制系统的传递函数(详细介绍)
  11. 《白话大数据与机器学习》读书笔记1
  12. 百度人脸识别申请授权文件步骤要领
  13. 算法笔记.胡凡 第五章 数学问题
  14. 【python基础知识学习(6)】面向对象编程
  15. 【CTF题解NO.00008】mini-LCTF 2021 official write up by arttnba3
  16. KBL410-ASEMI整流桥KBL410
  17. Hybrid App 发展史
  18. java分布式任务调度 唯品会,分布式定时任务调度系统Saturn安装部署
  19. 思维导图局域网共享功能使用教程
  20. PyTorch 实现批训练和 Optimizer 优化器

热门文章

  1. vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
  2. MultiProcessing中主进程与子进程之间通过管道(Pipe)通信
  3. 竟然有如何奇葩的如厕方式......
  4. 震撼世界的基建狂魔,中国制造的超级工程到底有多牛?
  5. OpenAI“单手解魔方”被公开质疑,Gary Marcus称七大问题涉嫌误导
  6. 老师“鬼话”全曝光!哈哈哈哈哈哈全国的老师都这样吗?
  7. 剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?
  8. 12星座程序员写代码
  9. mendelay为什么安装不了_你为什么消防验收过不了?消防管道安装错误图集
  10. textjoin去重_SuperJoinText这个函数,弥补了TEXTJOIN的缺憾