“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 hdu 6462 人类史上最大最好的希望事件 (斐波那契+前缀和)

题目地址 : http://acm.hdu.edu.cn/showproblem.php?pid=6462

人类史上最大最好的希望事件
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 383 Accepted Submission(s): 119


Problem Description
作为CNCS的半壁江山,狗哥常常在宇宙中心邵阳眺望黄浦江,夜晚的星空总是迷人,有时候还能见到彗星滑落。

狗哥是幸运的,他在两秒钟内看到了十七颗彗星划过天际,作为打ACM的学者,自然不会有「稳定-1」情况。他开始研究彗星运动的轨迹,发现他们都遵照斐波那契螺旋线在运动着。

尤里卡!狗哥觉得这就是找寻「生命,宇宙和一切的终极答案」的精要所在,但是怎么表示呢?狗哥觉得求取斐波那契螺旋线经过的一个个方格的面积之和就是公式的表现。

例如下图,螺旋线每划过一个方格,都转过了四分之一圈。如果我们以四分之一圈为单位,那么我们用类似带分数的形式表示螺旋线转动的起点和终点。例如,0+0 到 0 + 1 意即从第一个方格转到第二个方格,划过了前两个方格,他们的面积之和为2(1+1)。同理,0+0 到 1+0 划过了前五个方格,他们的面积之和为40(1+1+4+9+25)。

但是聪明的狗哥需要一个程序去获得指定范围内的螺旋线面积之和,狗哥给了你一首「希望之花」的时间,而他需要利用这个时间去打出四暗刻单骑。如果你能完成这个程序,狗哥会封你为格拉摩根伯爵

Input
不定组数据。

首先输入一个整数Q,代表狗哥询问次数。

接下来Q行,每行四个整数a,b,c,d,代表狗哥想求 a+b 到 c+d 之间的螺旋线面积之和。

1<= Q <= 10000

0<= a,c <= 10000

0 <= b,d <= 3

结果对 192600817 取模。

Output
一个数字,表示螺旋线面积之和。

Sample Input

4
0 0 0 1
0 0 1 0
1 2 2 1
1 1 0 3
4
0 0 0 1
0 0 1 0
1 2 2 1
1 1 0 3

Sample Output

2
40
4791
98
2
40
4791
98


题解

这是一个裸的前缀和,先求斐波那契的平方,然后求前缀和, 最后因为是减法, 要加上mod再模一次

代码

#include 
#define rep(i,a,n) for (int i=a;i
using namespace std;
typedef long long ll;
const ll mod=192600817;

const int N = 4e4+10;
ll pre[N];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	pre[0] = pre[1] = 1;
	
	rep (i, 2, N) {
		pre[i] = (pre[i-1] + pre[i-2]) % mod;
	}
	
	rep (i, 1, N) {
		pre[i] = (pre[i] % mod) * (pre[i] % mod) % mod;
		pre[i] = (pre[i-1] + pre[i]) % mod;
	}
	
	int q, a, b, c, d;
		while (cin >> q) {
			while (q--) {
			cin >> a >> b >> c >> d;
			int x = a*4 + b;
			int y = c*4 + d;
			cout << (pre[max(x,y)] - (min(x,y) == 0?0:pre[min(x,y)-1]) + mod) %mod << endl;
		}
	}
}

你可能感兴趣的:(hdu,题解)