【学习笔记】[ARC145F] Modulo Sum of Increasing Sequences

2023-10-11 04:12

本文主要是介绍【学习笔记】[ARC145F] Modulo Sum of Increasing Sequences,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单位根反演好题。

提示:是照搬的 这篇题解 的做法,只是加了一点小小的解释。

首先,做等价变换:给第 i i i个位置加上 i − 1 i-1 i1,问题转化为了求单调递增序列,即从 [ 0 , N + M − 1 ] [0,N+M-1] [0,N+M1]中选 N N N不同的数,使得这些数模 mod ⁡ \operatorname{mod} mod的值为 k k k

这事实上是一个二元 G F GF GF的问题。先不考虑选 N N N个数的限制,记 n = N + M n=N+M n=N+M,写出答案的生成函数形式: ∏ i = 0 n − 1 ( 1 + x i ) \prod_{i=0}^{n-1}(1+x^i) i=0n1(1+xi)

k = mod ⁡ k=\operatorname{mod} k=mod,那么我们要求所有 i k + r ik+r ik+r项的系数和,这通常可以用单位根反演来解决。

对于任意多项式 f ( x ) f(x) f(x),我们有:

∑ k ∣ i [ x i ] f ( x ) = ∑ i = 0 n − 1 [ x i ] f ( x ) 1 k ∑ j = 0 k − 1 w k i j = 1 k ∑ i = 0 n − 1 a i ∑ j = 0 k − 1 ( w k j ) i = 1 k ∑ j = 0 k − 1 ∑ i = 0 n − 1 a i ( w k j ) i = 1 k ∑ j = 0 k − 1 f ( w k j ) \begin{aligned}\sum_{k|i}[x^i]f(x)&=\sum_{i=0}^{n-1}[x^i]f(x)\frac{1}{k}\sum_{j=0}^{k-1}w_k^{ij}\\&=\frac{1}{k}\sum_{i=0}^{n-1}a_i\sum_{j=0}^{k-1}(w_k^j)^i\\&=\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^{n-1}a_i(w_k^j)^i\\&=\frac{1}{k}\sum_{j=0}^{k-1}f(w_k^j)\end{aligned} ki[xi]f(x)=i=0n1[xi]f(x)k1j=0k1wkij=k1i=0n1aij=0k1(wkj)i=k1j=0k1i=0n1ai(wkj)i=k1j=0k1f(wkj)

类似的: ∑ [ x i k + r ] f ( x ) = 1 k ∑ j = 0 k − 1 w k − j r f ( w k j ) \sum[x^{ik+r}]f(x)=\frac{1}{k}\sum_{j=0}^{k-1}w_k^{-jr}f(w_k^j) [xik+r]f(x)=k1j=0k1wkjrf(wkj)

注意这里的 k k k不是 2 2 2的次幂,因此不能直接计算。要想办法把单位根搞掉。

注意到 x n − 1 = ∏ i = 0 n − 1 ( x − w n i ) x^n-1=\prod_{i=0}^{n-1}(x-w_n^i) xn1=i=0n1(xwni) x = − 1 x=-1 x=1,那么 ∏ i = 0 n − 1 ( w n i + 1 ) = 1 − ( − 1 ) n \prod_{i=0}^{n-1}(w_n^i+1)=1-(-1)^n i=0n1(wni+1)=1(1)n

考虑 k ∣ n k|n kn的情况。 d = gcd ⁡ ( j , k ) d=\gcd(j,k) d=gcd(j,k),此时 gcd ⁡ ( j d , k d ) = 1 \gcd(\frac{j}{d},\frac{k}{d})=1 gcd(dj,dk)=1

f ( w k j ) = ∏ i = 0 n − 1 ( 1 + w k i j ) = ∏ i = 0 k d − 1 ( 1 + w k d i ) n d k = ( 1 − ( − 1 ) k d ) n d k \begin{aligned}f(w_k^j)&=\prod_{i=0}^{n-1}(1+w_k^{ij})\\&=\prod_{i=0}^{\frac{k}{d}-1}(1+w_{\frac{k}{d}}^{i})^{\frac{nd}{k}}\\&=(1-(-1)^{\frac{k}{d}})^{\frac{nd}{k}}\end{aligned} f(wkj)=i=0n1(1+wkij)=i=0dk1(1+wdki)knd=(1(1)dk)knd

带入原式即: 1 k ∑ j = 0 k − 1 w k − j r ( 1 − ( − 1 ) k d ) n d k \frac{1}{k}\sum_{j=0}^{k-1}w_k^{-jr}(1-(-1)^{\frac{k}{d}})^{\frac{nd}{k}} k1j=0k1wkjr(1(1)dk)knd,现在考虑怎么把前面的单位根搞掉。看到 gcd ⁡ \gcd gcd考虑枚举 d d d,即:

L H S = 1 k ∑ d ∣ k ( 1 − ( − 1 ) k d ) n d k ∑ gcd ⁡ ( j , k ) = d w k − j r LHS=\frac{1}{k}\sum_{d|k}(1-(-1)^{\frac{k}{d}})^{\frac{nd}{k}}\sum_{\gcd(j,k)=d}w_k^{-jr} LHS=k1dk(1(1)dk)kndgcd(j,k)=dwkjr

后面那一坨看起来就很好化简:

∑ gcd ⁡ ( j , k ) = d w k − j r = ∑ i = 1 k d w k − i d r [ gcd ⁡ ( i , k d ) = 1 ] = ∑ i = 1 k d w k − i d r ∑ j ∣ gcd ⁡ ( i , k d ) μ ( j ) = ∑ j ∣ k d μ ( j ) ∑ i = 1 k d j w k − i j d r = ∑ j ∣ k d μ ( j ) ∑ i = 1 k d j w k d j − r i = ∑ j ∣ k d μ ( j ) [ k d j ∣ r ] \begin{aligned}\sum_{\gcd(j,k)=d}w_k^{-jr}&=\sum_{i=1}^{\frac{k}{d}}w_k^{-idr}[\gcd(i,\frac{k}{d})=1]\\&=\sum_{i=1}^{\frac{k}{d}}w_k^{-idr}\sum_{j|\gcd(i,\frac{k}{d})}\mu(j)\\&=\sum_{j|\frac{k}{d}}\mu(j)\sum_{i=1}^{\frac{k}{dj}}w_k^{-ijdr}\\&=\sum_{j|\frac{k}{d}}\mu(j)\sum_{i=1}^{\frac{k}{dj}}w_\frac{k}{dj}^{-ri}\\&=\sum_{j|\frac{k}{d}}\mu(j)[\frac{k}{dj}|r]\end{aligned} gcd(j,k)=dwkjr=i=1dkwkidr[gcd(i,dk)=1]=i=1dkwkidrjgcd(i,dk)μ(j)=jdkμ(j)i=1djkwkijdr=jdkμ(j)i=1djkwdjkri=jdkμ(j)[djkr]

最后一步是 逆用单位根反演 。因此最终答案为:

L H S = 1 k ∑ d ∣ k ( 1 − ( − 1 ) k d ) n d k g ( d , k ) \begin{aligned}LHS=\frac{1}{k}\sum_{d|k}(1-(-1)^{\frac{k}{d}})^{\frac{nd}{k}}g(d,k)\end{aligned} LHS=k1dk(1(1)dk)kndg(d,k)

其中 g ( d , k ) g(d,k) g(d,k)是固定的系数。现在考虑二元 G F GF GF,即 [ x i k + r y n ] ∏ i = 0 n − 1 ( 1 + x i y ) [x^{ik+r}y^n]\prod_{i=0}^{n-1}(1+x^iy) [xik+ryn]i=0n1(1+xiy)。前面的推导都一模一样(把 y y y当成参量来处理),不难验证答案为:

L H S = 1 k ∑ d ∣ k ( 1 − ( − y ) k d ) n d k g ( d , k ) LHS=\frac{1}{k}\sum_{d|k}(1-(-y)^{\frac{k}{d}})^{\frac{nd}{k}}g(d,k) LHS=k1dk(1(y)dk)kndg(d,k)

对于 n ∤ k n\nmid k nk的情况,可以将剩余的不足 k k k项暴力背包,即设 f i , j f_{i,j} fi,j表示选了 i i i个数,并且模 k k k等于 j j j的方案数。可以在 O ( k 3 ) O(k^3) O(k3)的时间内处理出来,最后合并答案也是 O ( k 3 ) O(k^3) O(k3)的。

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second
using namespace std;
const int mod=998244353;
const int N=505;
const int M=2e6+5;
int n,m,p,n2,mx;
ll now[N][N];
ll fac[M],inv[M],f[N],g[N][N],res[N];
ll fpow(ll x,ll y=mod-2){ll z(1);for(;y;y>>=1){if(y&1)z=z*x%mod;x=x*x%mod;}return z;
}
void init(int n){fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;inv[n]=fpow(fac[n]);for(int i=n;i>=1;i--)inv[i-1]=inv[i]*i%mod;
}
int mu[N],vs[N];
int pr[N],cnt;
void init2(int n){mu[1]=1;for(int i=2;i<=n;i++){if(vs[i]==0)pr[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&pr[j]<=n/i;j++){vs[i*pr[j]]=1;if(i%pr[j]==0){mu[i*pr[j]]=0;break;}mu[i*pr[j]]=-mu[i];}}
}
ll binom(int x,int y){if(x<0||y<0||x<y)return 0;return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
void add(ll &x,ll y){x=(x+y)%mod;
}
vector<int>v;
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>p,n2=n+m;init(n2),init2(p);mx=p*(n2/p);for(int i=1;i<=p;i++){if(p%i==0)v.pb(i);}for(int k=0;k<p;k++){for(auto d:v){for(auto j:v){if(p/d%j==0&&k%(p/d/j)==0){add(g[k][d],mu[j]*p/d/j);}}}}now[0][0]=1;for(int i=mx;i<n2;i++){int s=i%p;for(int j=min(n2-mx,n);j>=1;j--){for(int k=0;k<p;k++){add(now[j][k],now[j-1][(k-s+p)%p]);}}}for(int i=0;i<=min(n,n2-mx);i++){memset(f,0,sizeof f);for(auto d:v){if((n-i)%(p/d))continue;int t=(n-i)/(p/d);for(int k=0;k<p;k++){if(p/d%2==1||t%2==0){add(f[k],binom(d*mx/p,t)*g[k][d]);}else{add(f[k],-binom(d*mx/p,t)*g[k][d]);}}}for(int j=0;j<p;j++){for(int k=0;k<p;k++){add(res[(j+k)%p],f[j]*now[i][k]);}}}for(int i=0;i<p;i++){res[i]=res[i]*fpow(p)%mod;}int tmp=(ll)n*(n-1)/2%p;for(int i=0;i<p;i++){cout<<(res[(i+tmp)%p]+mod)%mod<<" ";}
}

这篇关于【学习笔记】[ARC145F] Modulo Sum of Increasing Sequences的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/185432

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个