【题解】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\) 和 \(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\)。故:
证明 3
对于 \(j\in[1,p^x-1]\),有:
记 \(j=a\times p^{v}\),其中 \(a\perp p\)。由于 \(j<p^x\),有 \(v<x\)。因此:
故:
当 \(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();}

浙公网安备 33010602011771号