跳蚤国王要召开第二届内阁会议,所以把所有跳蚤都召集到了会议室。所有跳蚤在会议室的圆桌前坐成了一个圈,从$1$到$n$标号,每人的面前都有一盏明灯。
就在会议就要开始的时候,国王突然发现,并不是所有的灯都点亮了,有强迫症的他绝不会在有灯没有被点亮的时候开始会议。
现在国王要指定一些位置的跳蚤,他会报出这些跳蚤的序号,让他们把面前的灯改变状态。
可是这些跳蚤大臣并不想开会,虽然这些跳蚤必须按照国王的指令形式行事,但是他们会在国王下达指令之后,偷偷转动面前的桌子任意次(转动一次之后本来在$n$号跳蚤面前的灯就在$1$号跳蚤面前了),这样虽然对应序列的跳蚤确实改变了面前的灯的状态,但是会议并不能开始因为灯还没有全部点亮。
国王也知道这一点,所以他很好奇,他有没有一种办法在有限轮之后开始会议呢?
小w向国王毛遂自荐,国王很怀疑小w的能力,所以为了保证数据强度,国王会给小w一个初始的串,每次问小w一个子串是否能在有限轮之后开始会议。
如果区间长度$len=r-l+1$是奇数,并且不全灭或不全亮,那么无解
假设$len=q\cdot2^k$,其中$q$是奇数,把区间按$i\%2^k$分类,每类$q$盏灯,整个区间有解要求每组都有解,也就是每组全灭或全亮,所以如果没有长度为$2^k$的循环节,那么肯定无解
如果有长度为$2^k$的循环节,那么问题转化成只考虑这$2^k$盏灯,下面证明$2^k$盏灯是一定有解的
以下的多项式系数都是模$2$意义下的数(亮or灭),所有多项式运算在模$x^{2^k}-1$意义下进行(循环位移)
先证$x^{2^k}-1=(x-1)^{2^k}$
对$k$归纳,当$k=0$时显然成立
假设$x^{2^{k-1}}-1=(x-1)^{2^{k-1}}$,那么$(x-1)^{2^k}=\left((x-1)^{2^{k-1}}\right)^2=\left(x^{2^{k-1}}-1\right)^2=x^{2^k}-1$
由归纳法,定理得证
如果把这个区间看成多项式$f(x)$(亮灯系数为$1$,灭灯系数为$0$,系数是模$2$意义下的数),把国王的指令看成多项式$g(x)$,那么大臣旋转桌子$d$位后再执行指令可以看做$f'(x)=f(x)\cdot x^d+g(x)$,国王可以取$g(x)=f(x)$,那么$f'(x)=f(x)\left(x^d+1\right)=f(x)(x-1)(x^{d-1}+\cdots+1)$
国王每下一次命令,$f(x)$就会被乘上$(x-1)$,由$(x-1)^{2^k}=x^{2^k}-1$可得最后$f(x)$会变成$0$(被续取模),所以$2^k$盏灯一定有解
#include<stdio.h>
typedef unsigned long long ull;
char s[100010];
ull h[100010],b[100010];
ull get(int l,int r){return h[r]-h[l-1]*b[r-l+1];}
int main(){
int n,q,i,l,r;
scanf("%d%d%s",&n,&q,s+1);
b[0]=1;
for(i=1;i<=n;i++){
b[i]=b[i-1]*29ull;
h[i]=h[i-1]*29ull+(ull)(s[i]-'0');
}
while(q--){
scanf("%d%d",&l,&r);
i=r-l+1;
i&=-i;
if(l==r||get(l+i,r)==get(l,r-i))
puts("ephemeral");
else
puts("endless");
}
}