记$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. mysql int(3)与int(10)的数值范围相同吗?

    提问: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大? 回答: 不同,int(3)最多显示3位无符号整体,in ...

  2. Serverless 在 SaaS 领域的最佳实践

    作者 | 计缘 来源 | Serverless 公众号 随着互联网人口红利逐渐减弱,基于流量的增长已经放缓,互联网行业迫切需要找到一片足以承载自身持续增长的新蓝海,产业互联网正是这一宏大背景下的新趋势 ...

  3. Mybatis 一对多延迟加载,并且子查询中与主表字段不对应 (19)

    Mybatis  一对多延迟加载,并且子查询中与主表字段不对应应用说明. 实现一对多关联(懒加载),一个教研组对应多个教师,既:教师的教研编号与教研组的教研编号关联,并且教师关联教研组外键与教研组编号 ...

  4. 【错误分析】NX error status: 32

    在进行NX 制图里面的表格注释合并单元格时,总是报错NX error status: 32,找了很久都不知道问题所在. 报错提示如下: NXOpen.NXException: NX error sta ...

  5. Node.js CMS——基于 NestJS/NuxtJS 的完整开源项目

    这是一款轻量级的基于 Node.js 的开源 CMS,采用前后端分离开发模式,集成了 API.后台管理.WEB 展示三个完整项目.开箱即是一套完整的企业网站,适合企业.个人直接使用或二次开发. API ...

  6. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  7. 【二食堂】Beta - Scrum Meeting 8

    Scrum Meeting 8 例会时间:5.22 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. UI优化已经完成,顺带修复了一点小bug.issue 1. 文本导入.保存部 ...

  8. Spring Cloud Alibaba整合Sentinel

    Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...

  9. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

  10. 攻防世界 杂项 12.Training-Stegano-1

    题目描述: 这是我能想到的最基础的图片隐写术.啊这 题目分析: 最初还以为直接右击属性查看呢 然后用notepad++看看,一团乱码,结果在最后发现了passwd, 然后这就是flag:stegano ...