题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6462
原版题解:
先读懂题目。
我们有一个斐波那契数列 1 1 2 3 5 8 13
题目需要我们求所谓的面积之和
面积即为 1 1 4 9 25 64 169
然后一个简单的前缀和,计算面积和
然后斐波那契数列的平方和:
f1² + .....fn² = fn*fn+1
做题思路:
1. 那个图是从最小的两个正方形中上面那个的左下角开始转的。
2. 0 + 0 ,1 + 0 这些的意思是这样的:x + y ,x表示转了几个完整的圈,y表示转了几个1/4圈
所以0+0->1+0,就是转了一整圈
3. 先打个表
我认为的坑点:
因为数据都mod过,可能会出现 prefix【i】-prefix【j】为负数的情况(即使i>j)
所以输出的时候相减加个mod再取余就不会WA。以后这种题目都加个mod吧,加了不可能错,不加却有可能。
养成好习惯,从你我做起呀。(WA哭了)
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 40000+10;
const ll mod = 192600817;
ll f[N];
ll prefix[N];
void getf()
{
f[1] = f[2] =1;
prefix[1] = 1;
prefix[2] = 2;
for (int i=3;i<N;i++){
f[i] = (f[i-1]+f[i-2])%mod;
prefix[i] = (prefix[i-1] + f[i]*f[i]%mod)%mod;
///prefix[i-1] = (f[i-1]*f[i])%mod;//这样求也可以
}
}
int main()
{
getf();
int t;
while (~scanf("%d",&t)){
while (t--){
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
int st = a*4+b;
int ed = c*4+d;
if (ed < st) swap(st,ed);
ed++;
printf("%lld\n",(prefix[ed]-prefix[st]+mod)%mod);
}
}
return 0;
}