51nod-1346: 递归

【传送门:51nod-1346


简要题意:

  给出一个式子a[i][j]=a[i-1][j]^a[i][j-1]

  给出a[1][i],a[i][1](2<=i<=131172)

  有n个询问,每个询问输入x,y

  求出a[x+131072][y+131072]


题解:

  真是一道有趣的题目。。

  显然不能直接做,然后我直接打了个表。。发现a[i][j]=a[i-k][j]^a[i][j-k](k<=min(i,j),且k为偶数)

  那答案不就是a[x+131072][y+131072]=a[x][y+131072]^a[x+131072][y]

  直接暴力得到a[1~100][1~131172]和a[1~131172][1~100]就行了


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[110][131173];
int b[131173][110];
int main()
{
    for(int i=2;i<=131172;i++)
    {
        scanf("%d",&a[1][i]);
        if(i<=100) b[1][i]=a[1][i];
    }
    for(int i=2;i<=131172;i++)
    {
        scanf("%d",&b[i][1]);
        if(i<=100) a[i][1]=b[i][1];
    }
    for(int i=2;i<=100;i++)
    {
        for(int j=2;j<=131172;j++) a[i][j]=a[i-1][j]^a[i][j-1];
    }
    for(int i=2;i<=131172;i++)
    {
        for(int j=2;j<=100;j++) b[i][j]=b[i-1][j]^b[i][j-1];
    }
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d
",a[x][y+131072]^b[x+131072][y]);
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/Never-mind/p/9790195.html