题目地址:https://nanti.jisuanke.com/t/38230
题意
嵌套规则如下:
给出数组和x,y,求w(x,y)的值
解题思路
打表找规律(;´༎ຶД༎ຶ`)。。。比赛的时候没有找对,比完手算找规律,也可以用代码打表(还不太会)
‘④’符号表示这堆元素重复出现了多少次,黑色的圈表示最终选择(留下)的数据
令len1=y-x+1,len2=(y-x)/2+1
当len1为奇数时:
以w(1,9)为例,w(x,y)->f(i,j)的结果如下:其中i次表示这一行中的所有f(i,j)都在最外面的框里出现了i次(emm自己列一下会比较好懂)
一共出现了len1=y-x+1=9-1+1=9行(奇数)
f(i,j)->ai结果如下:
图中一共了len2=(y-x)/2+1=(9-1)/2+1=5行(奇数)
从图中可以看出最后的结果是a1^a5^a9即ax^a(x+4)^a(x+8)^...^ay
但是如果是偶数行呢,以w(1,11)为例(仍在len1为奇数的前提下),对应的f(i,j)->ai结果如下:
图中一共len2=(y-x)/2+1=6行(偶数)
从图中可以看出最后的结果是a2^a6^a10即a(x+1)^a(x+1+4)^a(x+1+8)^....^a(y-1)
当len1为偶数时:
以w(1,10)为例,w(x,y)->f(i,j)的结果如下
f(i,j)->ai的结果如下:
图中一共有len2=(y-x)/2+1=5行(奇数)
最终结果为:a1^a2^a5^a6^a9^a10即ax^a(x+4)^a(x+8)^...^a(y-1) ^ a(x+1)^a(x+1+4)^a(x+1+8)^....ay
如果上图是偶数行呢?以w(1,12)为例,f(i,j)->ai的结果如下:
图***有len2=(y-x)/2+1=6行(偶数)
最终结果为0
综上所述:
len1为奇数:1⃣️ len2为奇数: ans=ax^a(x+4)^a(x+8)^...^ay
2⃣️len2为偶数: ans=a(x+1)^a(x+1+4)^a(x+1+8)^...^a(y-1)
len1为偶数: 1⃣️ len2为奇数: ans=ax^a(x+4)^a(x+8)^....^a(y-1) ^ a(x+1)^a(x+1+4)^a(x+1+8)^...^ay
2⃣️len2为偶数: ans=0
ac代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <ctype.h>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <sstream>
#define maxn 100005
typedef long long ll;
const ll mod=1e9+7;
using namespace std;
int main()
{
//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
ll t,n,q,x,y,a[maxn],sum[maxn];
scanf("%lld",&t);
while(t--)
{
memset(sum,0,sizeof(sum));
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if(i<=4) sum[i]=a[i];
else sum[i]=sum[i-4]^a[i];//sum[5]=sum[1]^a[5]
}
scanf("%lld",&q);
while(q--)
{
ll ans=0;
scanf("%lld %lld",&x,&y);
ll len1=y-x+1,len2=(y-x)/2+1;
if(len1%2)
{
if(len2%2)
{
ans=sum[y];
if(x>=4)
ans=ans^sum[x-4];
}
else
{
ans=sum[y-1];
if(x+1>=4)
ans=ans^sum[x+1-4];
}
}
else
{
if(len2%2)
{
ans=sum[y-1];
if(x>=4)
ans=ans^sum[x-4];
ans^=sum[y];
if(x+1>=4)
ans=ans^sum[x+1-4];
}
else
ans=0;
}
printf("%lld\n",ans);
}
}
return 0;
}