记$g(k)$为$c$恰为$k$的合法三元组数,显然$f(k)=\sum_{i=1}^{k}g(i)$

结论:若$\lim_{k\rightarrow \infty}\frac{g(k)}{k^{2}}$存在,记其为$s$,则$\lim_{k\rightarrow \infty}\frac{f(k)}{k^{3}}=\frac{1}{3}s$

任取正实数$\epsilon$,根据极限的定义$\exists k_{0}\ge 1$,满足$\forall k\ge k_{0},s-\epsilon\le \frac{g(k)}{k^{2}}\le s+\epsilon$

对其求和并简单变形,不难得到$s-\epsilon\le \frac{\sum_{i=k_{0}}^{k}g(i)}{\sum_{i=k_{0}}^{k}i^2}\le s+\epsilon$

当$k\rightarrow\infty$时,显然中间的式子可以看作$\frac{f(k)}{\frac{1}{3}k^{3}}$,即得证

由此,不妨考虑如何求出$s$,进行如下构造:

定义$[x]$为$x$的小数部分,即$[x]=x-\lfloor x\rfloor$(这里$\lfloor x\rfloor$为小于等于$x$的最大整数)

注意到$x\ mod\ c<y\ mod\ c$当且仅当$[\frac{x}{c}]<[\frac{y}{c}]$,将其代入条件,也即$(aX_{i}+b)mod\ c$严格单调递增当且仅当$[\alpha X_{1}+\beta]<[\alpha X_{2}+\beta]<...<[\alpha X_{n}+\beta]$(其中$\alpha=\frac{a}{c}$且$\beta=\frac{b}{c}$)

考虑$\alpha$和$\beta$,由于$c(=k)\rightarrow \infty$,因此$a,b\in [0,c)$可以看作$\alpha$和$\beta$在$[0,1)$内均匀分布

记$D=\{(\alpha,\beta)\mid \alpha,\beta\in [0,1)$且$[\alpha X_{1}+\beta]<[\alpha X_{2}+\beta]<...<[\alpha X_{n}+\beta]\}$,不妨考虑将$D$中的点都染上黑色,此时问题即求黑色部分的面积

将$[0,1)$看成一个圆(顺时针方向为增大),并定义$f_{i}(\alpha)$为$[\alpha X_{i}]$到$[\alpha X_{i+1}]$在圆上顺时针方向的距离,那么不难得到$f_{i}(\alpha)=[(X_{i+1}-X_{i})\alpha]$(特别的,定义$X_{n+1}=X_{1}$)

对于$\alpha\in [0,1)$,$\exists \beta\in [0,1),(\alpha,\beta)\in D$的必要条件为$\sum_{i=1}^{n}f_{i}(\alpha)=1$(感性理解,即至多只能转一圈)

进一步的,若$\alpha$满足此条件,那么$(\alpha,\beta)\in D$当且仅当$[\alpha X_{1}+\beta]<[\alpha X_{n}+\beta]$(结合前者显然),进而不难得到$\alpha$所在列上黑色部分的长度即为$[(X_{1}-X_{n})\alpha]$

事实上,这里并没有考虑$[\alpha X_{i}+\beta]=[\alpha X_{i+1}+\beta]$的情况,但显然线段并不影响面积

枚举$\lfloor (X_{i+1}-X_{i})\alpha\rfloor$,即将$[0,1)$划分为$o(|X_{i+1}-X_{i}|)$段,每一段的$f_{i}(\alpha)$都是关于$\alpha$的一次函数,那么考虑$\sum_{i=1}^{n}f_{i}(\alpha)$即是一个$o(\sum_{i=1}^{n}|X_{i+1}-X_{i}|)$段的一次函数

对于其中一段,若其截距为1(不难发现斜率必然为0),那么即对$[(X_{1}-X_{n})\alpha]$求一个区间定积分,将其的端点也加入后同样变为一次函数,直接计算即可

时间复杂度为$o(S\log S)$(其中$S=\sum_{i=1}^{n}X_{i}$),可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define mod 998244353
5 #define inv2 499122177
6 #define inv3 332748118
7 #define ll long long
8 #define fi first
9 #define se second
10 int qpow(int n,int m){
11 int s=n,ans=1;
12 while (m){
13 if (m&1)ans=(ll)ans*s%mod;
14 s=(ll)s*s%mod;
15 m>>=1;
16 }
17 return ans;
18 }
19 struct Frac{
20 int a,b;
21 Frac(){
22 a=0,b=1;
23 }
24 Frac(int aa,int bb){
25 int g=__gcd(aa,bb);
26 a=aa/g,b=bb/g;
27 }
28 bool operator < (const Frac &k)const{
29 return (ll)a*k.b<(ll)b*k.a;
30 }
31 int get_val(){
32 return (ll)a*qpow(b,mod-2)%mod;
33 }
34 };
35 struct Line{
36 int k,b;
37 Line(){
38 k=b=0;
39 }
40 Line(int kk,int bb){
41 k=kk,b=bb;
42 }
43 int get_int(Frac x){
44 int s=x.get_val();
45 return (((ll)inv2*k%mod*s%mod*s+(ll)b*s)%mod+mod)%mod;
46 }
47 int get_int(Frac x,Frac y){
48 return (get_int(y)-get_int(x)+mod)%mod;
49 }
50 };
51 vector<pair<Frac,int> >v;
52 int n,s,ans,a[N];
53 int main(){
54 scanf("%d",&n);
55 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
56 a[n+1]=a[1];
57 for(int i=1;i<=n;i++){
58 if (a[i]==a[i+1])continue;
59 if (a[i]<a[i+1]){
60 for(int j=1;j<a[i+1]-a[i];j++)v.push_back(make_pair(Frac(j,a[i+1]-a[i]),-1));
61 }
62 else{
63 for(int j=0;j<a[i]-a[i+1];j++)v.push_back(make_pair(Frac(j,a[i]-a[i+1]),1));
64 }
65 }
66 v.push_back(make_pair(Frac(1,1),0));
67 sort(v.begin(),v.end());
68 for(int i=0,j=0;i<v.size();i++){
69 if ((i)&&(v[i-1].fi<v[i].fi)){
70 if (s==1){
71 if (a[1]>a[n])ans=(ans+Line(a[1]-a[n],-j).get_int(v[i-1].fi,v[i].fi))%mod;
72 else ans=(ans+Line(a[1]-a[n],j+1).get_int(v[i-1].fi,v[i].fi))%mod;
73 }
74 }
75 s+=v[i].se;
76 while (!(v[i].fi<Frac(j+1,abs(a[1]-a[n]))))j++;
77 }
78 ans=(ll)inv3*ans%mod;
79 printf("%d\n",ans);
80 return 0;
81 }

[atARC126F]Affine Sort的更多相关文章

  1. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  2. ARC126F

    [ARC126F] Affine Sort 给定一个长为 \(N\) 的序列 \(x\) ,定义 \(f(K)\) 表示满足下述条件的 \((a,b,c)\) 个数: \(1\le c\le K,0\ ...

  3. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  4. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  5. shell之sort命令

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

  6. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

  7. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  8. js sort() reverse()

    数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...

  9. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

随机推荐

  1. JS中变量的命名规范

    命名规范 包含数字.字母.下划线和$,但 不能以数字开头 变量名严格区分大小写 变量名不能是关键字和保留字 变量名要见名知意 如果变量名有多个单词组成,推荐使用 小驼峰命名法 命名时,尽量使用英语,如 ...

  2. PTA实验4-2-3 验证“哥德巴赫猜想” (20分)

    实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...

  3. MyBatis的框架设计

    1.MyBatis的框架设计 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信 ...

  4. LCP 07.传递消息

    题目 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可 ...

  5. .NET CLI简单教程和项目结构

    WHAT IS .NET CLI ? .NET 命令行接口 (CLI) 工具是用于开发.生成.运行和发布 .NET 应用程序的跨平台工具链. 来源:.NET CLI | Microsoft Docs ...

  6. Java:内部类小记

    Java:内部类小记 对 Java 中的 内部类,做一个微不足道的小小小小记 首先:内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的. 成员内部类 成员内 ...

  7. Scrum Meeting 11

    第11次例会报告 日期:2021年06月01日 会议主要内容概述: 汇报了进度,开始爆肝. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公开性: ...

  8. 「刷题」THUPC泛做

    刷了一下,写一下. T1. 天天爱射击 可以这样想. 我们二分一下每一块木板在什么时刻被击碎. 然后直接用主席树维护的话是\(O(nlog^2n)\)的. 会\(T\),而且是一分不给那种... 那么 ...

  9. 2021.8.8考试总结[NOIP模拟33]

    T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...

  10. Envoy实现.NET架构的网关(三)代理GRPC

    什么是GRPC gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架.gRPC 的主要好处是: 现代.高性能.轻量级的 RPC 框架. 契约优先的 API 开发,默认使用协议缓冲区,与语言无 ...