qzezoj梦境题解--zhengjun

    科技2022-08-15  98

    其实不难,手推一下就发现规律: X m ( k + 1 ) + 1 = A 1 X_{m(k+1)+1}=A_1 Xm(k+1)+1=A1

    X m ( k + 1 ) + 2 = A 2 X_{m(k+1)+2}=A_2 Xm(k+1)+2=A2

    ⋯ \cdots

    X m ( k + 1 ) + k = A k X_{m(k+1)+k}=A_k Xm(k+1)+k=Ak

    X m ( k + 1 ) = A 1 ⊕ A 2 ⊕ ⋯ ⊕ A k X_{m(k+1)}=A_1 ⊕A_2⊕\cdots⊕A_k Xm(k+1)=A1A2Ak

    所以代码就不难了。

    #include<cstdio> using namespace std; int n; long long a[100002],sum,s1[100002]; long long l,r; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),sum^=a[i]; a[++n]=sum; for(int i=1;i<=n;i++)s1[i]=s1[i-1]^a[i]; int T; scanf("%d",&T); while(T--){ scanf("%lld%lld",&l,&r); l%=n;r%=n; if(!l)l=n; if(!r)r=n; printf("%lld ",s1[r]^s1[l-1]); } return 0; }
    Processed: 0.028, SQL: 9