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\n",a[x][y+131072]^b[x+131072][y]); } return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚