\(\mathcal{Description}\)

  Link.

  给定 \(\{x_n\}\),令

\[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k],\left(\forall i\in[1,n),(ax_i+b)\bmod c<(ax_{i+1}+b)\bmod c\right)\}\right|
\]

求出

\[\lim_{k\rightarrow+\infty}\frac{f(k)}{k^3}\bmod 998244353.
\]

  \(n\le10^3\),\(\sum x\le5\times10^5\)。

\(\mathcal{Solution}\)

  太炫酷了叭。

  令 \(g(k)=f(k)-f(k-1)\),断言这样一条性质:

\[\newcommand{\eps}[0]{\varepsilon}\lim_{k\rightarrow+\infty}\frac{f(k)}{k^3}=\lim_{k\rightarrow+\infty}\frac{g(k)}{3k^2}.
\]

甚至可以认为给原式洛了一发。

证明

  假定存在 $c=\lim_{k\rightarrow+\infty}\frac{g(k)}{k^2}$,则对于任意 $\varepsilon\in\mathbb R_+$,应有足够大的 $k$,使得 $(c-\eps)k^2\le g(k)\le (c+\eps)k^2$。继而,也应有足够大的 $k$ 使得 $(c-\eps)\sum_{i\le k}i^2\le f(k)\le(c+\eps)\sum_{i\le k}i^2$。考虑到 $\sum_{i\le k}i^2=\frac{k^3}{3}+\mathcal O(k^2)$,可以得到 $\frac{1}{3}c-\eps\le \frac{f(k)}{k^3}\le \frac{1}{3}c+\eps$。所以基于这个假设,得到 $\lim_{k\rightarrow+\infty}\frac{f(k)}{k^3}=\frac{1}{3}\lim_{k\rightarrow+\infty}\frac{g(k)}{k^2}$。

  此后,考虑使得 \((ax_i+b)\bmod k\) 单增的 \((a,b)\),根据取模的性质,应该有 \(\left\{\frac{ax_i+b}{k}\right\}\) 单增,其中 \(\{x\}=x-\lfloor x\rfloor\) 表示取非负数 \(x\) 的小数部分。所以,令 \(\alpha=\frac{a}{k},\beta=\frac{b}{k}\),我们仅需研究使得 \(\{\alpha x_i+\beta\}\) 单增的 \((\alpha,\beta)\in[0,1)^2\)。具体地,令

\[D=\{(\alpha,\beta)\in[0,1)^2\mid \forall i\in[1,n),\{\alpha x_i+\beta\}<\{\alpha x_{i+1}+\beta\}\},
\]

我们所求即为 \(D\) 的面积。

  这步转化的具体数学原理我并没有学懂,这貌似也涉及了上文中“假定极限存在”的证明。当然存在一些感性理解方法也显得不够具有说服力。如果希望深刻研究请参考 官方题解 叭,这里先跳过,之后的步骤仍有思考价值。

  我们把 \(\{y_i=\{\alpha x_i+\beta\}\}\) 放在 \([0,1)\) 这个关于 \(1\) 的“模域”上(Tiw: 你把“模”和“域”放一起是完全不合理的!我:?),进一步研究 \((\alpha,\beta)\) 的性质:

  可见,\(\alpha\) 能决定 \(y_i\) 在圆周上的相对位置关系,而 \(\beta\) 仅能整体旋转 \(y\),也即是确定 \(0\) 的位置。显然,对于使得相对位置合法的 \(\alpha\),合法 \(\beta\) 取值区间的长度为 \(\{\alpha(x_1-x_n)\}\);另一方面,对于这样的 \(\alpha\),应有

\[\sum_{i=1}^{n}(\{\alpha x_{i+1}\}-\{\alpha x_i\})\bmod 1=1.~~~~(x_{n+1}=x_1)
\]

同时,\(\alpha\in[0,1)\),\(x_i\in\mathbb N\),则 \(\{\alpha x_{i+1}\}-\{\alpha x_i\}\equiv\{\alpha(x_{i+1}-x_i)\}\pmod 1\),可见在 \(\alpha\) 从 \(0\) 向 \(1\) 取值时,仅有经过某个 \(\frac{t}{|x_{i+1}-x_i|}\) 会改变左式的值,即这些点把 \([0,1)\) 分隔为若干区间,若一个区间合法,再积分求此时 \(\beta\) 的贡献,即 \(\int_{l}^r\{\alpha(x_1-x_n)\}\text d\alpha\)。注意 \(|x_n-x_{n+1}|\) 也在分隔点的分母中,所以这是单纯的一次函数积分。

  最终,复杂度瓶颈为取出 \(\mathcal O(\sum x)\) 个区间排序,即 \(\mathcal O(\sum x\log\sum x)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 1e3, MOD = 998244353, INV6 = 166374059;
int n, x[MAXN + 5]; inline int iabs( const int u ) { return u < 0 ? -u : u; }
inline int mul( const int u, const int v ) { return 1ll * u * v % MOD; }
inline int sub( int u, const int v ) { return ( u -= v ) < 0 ? u + MOD : u; }
inline int add( int u, const int v ) { return ( u += v ) < MOD ? u : u - MOD; }
inline int mpow( int u, int v = MOD - 2 ) {
int ret = 1;
for ( ; v; u = mul( u, u ), v >>= 1 ) ret = mul( ret, v & 1 ? u : 1 );
return ret;
} struct Atom {
int a, b, c;
inline bool operator < ( const Atom& t ) const {
return 1ll * a * t.b < 1ll * t.a * b;
}
};
std::vector<Atom> sec; int main() {
scanf( "%d", &n );
rep ( i, 1, n ) scanf( "%d", &x[i] );
x[n + 1] = x[1]; int circ = 0;
rep ( i, 1, n ) {
int k = iabs( x[i] - x[i + 1] ), d = x[i] < x[i + 1] ? -1 : 1;
rep ( j, 1, k - 1 ) sec.push_back( { j, k, d } );
circ += x[i] >= x[i + 1];
}
sec.push_back( { 0, 1, 0 } ), sec.push_back( { 1, 1, 0 } );
std::sort( sec.begin(), sec.end() ); int ans = 0;
for ( size_t i = 1; i < sec.size(); ++i ) {
if ( ( circ += sec[i - 1].c ) != 1 ) continue;
int dn = sub( mul( sec[i].a, mpow( sec[i].b ) ),
mul( sec[i - 1].a, mpow( sec[i - 1].b ) ) ); int le = ( 1ll * sec[i - 1].a * ( x[1] - x[n] ) % sec[i - 1].b
+ sec[i - 1].b ) % sec[i - 1].b;
if ( !le && x[1] < x[n] ) le = sec[i - 1].b;
le = mul( le, mpow( sec[i - 1].b ) ); int ri = ( 1ll * sec[i].a * ( x[1] - x[n] ) % sec[i].b
+ sec[i].b ) % sec[i].b;
if ( !ri && x[1] > x[n] ) ri = sec[i].b;
ri = mul( ri, mpow( sec[i].b ) ); ans = add( ans, mul( add( le, ri ), dn ) );
}
printf( "%d\n", mul( ans, INV6 ) );
return 0;
}

Solution -「ARC 126F」Affine Sort的更多相关文章

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. Solution -「ARC 101D」「AT4353」Robots and Exits

    \(\mathcal{Description}\)   Link.   有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...

  3. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  4. Solution -「ARC 125E」Snack

    \(\mathcal{Description}\)   Link.   把 \(n\) 种零食分给 \(m\) 个人,第 \(i\) 种零食有 \(a_i\) 个:第 \(i\) 个人得到同种零食数量 ...

  5. Solution -「ARC 110D」Binomial Coefficient is Fun

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...

  6. Solution -「ARC 063D」「AT 2149」Snuke's Coloring 2

    \(\mathcal{Decription}\)   Link.   平面上有一个左下角坐标 \((0,0)\) 右上角坐标 \((W,H)\) 的矩形,起初长方形内部被涂白. 现在给定 \(n\) ...

  7. Solution -「ARC 124E」Pass to Next

    \(\mathcal{Description}\)   Link.   有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...

  8. Solution -「ARC 126E」Infinite Operations

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),定义一次操作为: 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R ...

  9. Solution -「ARC 058C」「AT 1975」Iroha and Haiku

    \(\mathcal{Description}\)   Link.   称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...

随机推荐

  1. 公网ip定位原理-心得

    1.前言 正在做一个根据公网ip来定位到大体的位置,一般是精确到城市或地区, 如果想要精确到街道和地图一一对应,那得使用GPS才可以,这里不讨论. 2.科普 公网也就是外网,由运营商的机房服务器自动给 ...

  2. vue爬坑之路(插件安装)

    npm install vue-table-with-tree-grid --save import ZkTable from 'vue-table-with-tree-grid' Vue.use(Z ...

  3. 51 Nod 1134 最长递增子序列 (动态规划基础)

    原题链接:1134 最长递增子序列 题目分析:长度为  的数列  有多达  个子序列,但我们应用动态规划法仍可以很高效地求出最长递增子序列().这里介绍两种方法. 先考虑用下列变量设计动态规划的算法. ...

  4. Whitelabel Error Page错误原因

    前言: 今天在做项目中遇到了一个问题,项目启动成功,但是前段访问接口始终访问不成功,页面一直在404,百度了一番无非两种解决方案: 一.解决方案 1.项目是boot项目查看启动类的位置是否放置正确 要 ...

  5. SpringBoot整合Elasticsearch+ik分词器+kibana

    话不多说直接开整 首先是版本对应,SpringBoot和ES之间的版本必须要按照官方给的对照表进行安装,最新版本对照表如下: (官网链接:https://docs.spring.io/spring-d ...

  6. 《剑指offer》面试题52. 两个链表的第一个公共节点

    问题描述 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], lis ...

  7. 【分享】让prometheus支持PUSH模式,可以使用remote write协议推送数据

    2021-10-21补充: 我通过修改源码来让prometheus支持remote-write,纯属多此一举: --enable-feature=remote-write-receiver这个命令行参 ...

  8. Jquery Ajax添加header参数

    在使用ajax请求接口时需要在请求头添加token来进行身份验证,方式如下: $.ajax({ type: 'GET', url: 'http://api.php', dataType: 'json' ...

  9. CSS实现事件穿透与背景图不跟随滚动条

    1. 事件穿透属性:pointer-events: none  // auto默认值.none:不捕捉target事件(实现穿透) 用途:当需要使用透明遮罩并且允许点击遮罩下方元素时,或需要使用背景容 ...

  10. 使用gdi+实时绘制picturebox(画个叉)

    private void DrawReticle(System.Drawing.Point pt, int size)//画一个透明的前景图片上画十字 { Bitmap bmp = new Bitma ...