http://acm.hdu.edu.cn/showproblem.php?pid=6462
思路:
主要是这个起点和终点的表示方法有毒
因为一次转1/4
0+0表示第0个⚪第一次转的部分
0+1表示第0个⚪第二次转的部分
然后是0+1 0+2 0+3 1+0 1+1 1+2 类似四进制
所以等会输入a b c d 转化为第几个⚪的公式就是a*4+b和c*4+d
最后就是求两者之间的前缀和了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=192600817;
const int inf = 0x3f3f3f3f;
const int maxn = 40005;
ll aa[maxn];
ll bb[maxn];
void db() {
aa[0] = 1;
aa[1] = 1;
bb[0] = aa[0];
bb[1] = aa[0] + aa[1];
for(int i = 2; i < 40005; i++) {
aa[i] = aa[i-1]%mod + aa[i-2]%mod;
bb[i] = ((aa[i]*aa[i])%mod + bb[i-1]%mod)%mod;
}
}
int main() {
int n;
db();
while(~scanf("%d", &n)) {
int a, c, b, d;
for(int i = 0; i < n; i++) {
scanf("%d%d%d%d", &a, &b, &c, &d);
int x = a*4+b;
int y = c*4+d;
if(x < y) swap(x, y);
printf("%lld\n",(bb[x]-bb[y-1]+mod)%mod);
}
}
}