【题解】LG P5379 [THUPC 2019] 令人难以忘记的题目名称

部分借鉴这篇题解,如有勘误还请不吝赐教。

思路

先讲讲主要的思路,一些东西的证明会放到后面。

因为要求最后是 \(p\) 的倍数,不妨将 \(S_i\) 全都对 \(p\) 取模。以下的运算也都是模 \(p\) 意义下的(除了序列下标的运算是模序列长度 \(n\) 意义下的)。

首先考虑什么样的局面能必胜。显然如果 \(S_i\) 全都是 \(0\),则操作 \(0\) 次即可获胜。进一步,如果 \(S_i\) 全都是 \(a\ (a\ne0)\),则选定 \(T_i=-a\),操作 \(1\) 次即可获胜。再进一步,如果 \(S_i\) 的差分 \(\Delta S_i\)(也就是 \(S_{i+1}-S_i\))都是 \(a\ (a\ne0)\),则选定 \(\Delta T_i=-a\),操作两次即可获胜。

那么如果我们多进几步,能否推广到:若 \(S_i\)\(k\) 阶差分 \(\Delta^kS_i=0\),则操作 \(k\) 次即可获胜?答案是肯定的。直接令 \(T_i=-S_i\) 即可归纳证明(证明 1)。

那么我们考虑如何找出最小的 \(k\) 使得 \(\Delta^kS_i=0\)。由于我们知道,\(\Delta^kS_i=\sum_{j=0}^{k}(-1)^{k-j}{k\choose j}S_{i+j}\)证明 2),可以得到 \(\Delta^{p^x}S_i=S_{i+p^x}-S_i\)证明 3)。于是可以得到,\(\Delta^{p^x}S_i=0\Leftrightarrow S_i=S_{i+p^x}\)。由裴蜀定理,这又等价于 \(S_{i}=S_{i+\gcd(p^x,n)}\)证明 4),所以对于 \(n\) 中质因子 \(p\) 的数量 \(t\)\(\Delta^{p^x}S_i=\Delta^{p^t}S_i\ (x\ge t)\)。因此 \(k\le p^t\),同时有必胜的充要条件:\(\forall i\in[0,n),S_i=S_{i+p^t}\)

于是我们考虑求出 \(k\)。由于 \(S_i=S_{i+p^t}\),我们可以只保留长为 \(p^t\) 的一段循环节。此时,如果 \(\Delta^{p^{t-1}}S_i=0\),则再递归到长为 \(p^{t-1}\) 的循环节;否则做一遍 \(p^{t-1}\) 阶差分,继续判断 \(\Delta^{p^{t-1}}S_i\) 是否等于 \(0\)。总的时间复杂度 \(O(np)\)


一些证明

证明 1

假设我们已经证明对于 \(t<k\),若 \(\Delta^tS_i=0\) 则操作 \(t\) 次即可获胜。设 \(\Delta^{k-1}S_i=a\ne0\),则 \(\Delta^{k-1}T_i=\Delta^{k-1}(-S_i)=-\Delta^{k-1}S_i=-a\)。定义移位算子 \(ES_i=S_{i+1}\),有:

\[\Delta ES_i=\Delta S_{i+1}=S_{i+2}-S_{i+1}=E(S_{i+1}-S_i)=E\Delta S_{i} \]

\(\Delta\)\(E\) 可以交换。故 \(\Delta^{k-1}E^xT_i=E^x\Delta^{k-1}T_i=E^x(-a)=-a\)。于是 \(\Delta^{k-1}(S_i+E^xT_i)=0\),即若 \(\Delta^kS_i=0\),则操作 \(1\) 次后 \(\Delta^{k-1}S_i=0\),得证。

证明 2

定义恒等算子 \(IS_i=S_i\),则有 \(\Delta=E-I\)。故:

\[\begin{aligned} \Delta^kS_i&=(E-I)^kS_i\\ &=S_i\sum_{j=0}^{k}{k\choose j}E^j(-I)^{k-j}\\ &=\sum_{j=0}^{k}(-I)^{k-j}{k\choose j}E^jS_i\\ &=\sum_{j=0}^{k}(-1)^{k-j}{k\choose j}S_{i+j} \end{aligned} \]

证明 3

对于 \(j\in[1,p^x-1]\),有:

\[{p^x\choose j}=\frac{p^x}{j}{p^x-1\choose j-1} \]

\(j=a\times p^{v}\),其中 \(a\perp p\)。由于 \(j<p^x\),有 \(v<x\)。因此:

\[\frac{p^x}{j}=\frac{p^{x-v}}{a}\equiv0\pmod{p} \]

故:

\[\Delta^{p^x}S_i=S_{i+p^x}+(-1)^{p^x}S_i \]

\(p\ne2\) 时,上式即为 \(S_{i+p^x}-S_i\);当 \(p=2\) 时,由于 \(1=-1\),上式同样等于 \(S_{i+p^x}-S_i\)。得证。

证明 4

由裴蜀定理,\(\exist a,b,ap^x+bn=\gcd(p^x,n)\)。所以 \(S_i=S_{i+p^x}=S_{i+ap^x}=S_{i+ap^x+bn}=S_{i+\gcd(p^x,n)}\)


Code

#include<bits/stdc++.h>
#define ll long long
#define il inline

using namespace std;
namespace asbt{
const int maxn=3e5+5;
int n,m,a[maxn],b[maxn];
il bool check(int mm){
	for(int i=0;i<mm;i++){
		if(a[i]!=a[(i+mm/m)%mm]){
			return 0;
		}
	}
	return 1;
}
il int solve(int mm){
	if(mm==1){
		return a[0]>0;
	}
	int ans=0;
	while(!check(mm)){
		for(int i=0;i<mm;i++){
			b[i]=(a[(i+mm/m)%mm]-a[i]+m)%m;
		}
		for(int i=0;i<mm;i++){
			a[i]=b[i];
		}
		ans+=mm/m;
	}
	return ans+solve(mm/m);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	int t=0,nn=n,mm=1;
	while(nn%m==0){
		nn/=m,mm*=m,t++;
	}
	for(int i=0;i<n;i++){
		cin>>a[i];
		a[i]%=m;
	}
	for(int i=0;i<n;i++){
		if(a[i]!=a[(i+mm)%n]){
			cout<<-1;
			return 0;
		}
	}
	cout<<solve(mm);
	return 0;
}
}
int main(){return asbt::main();}

posted @ 2025-11-23 11:28  zhangxy__hp  阅读(12)  评论(0)    收藏  举报