2020icpc上海赛G题 Fibonacci详解

Fibonacci(icpc2020上海赛)

链接:icpc2020上海赛G题Fibonacci
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

In mathematics, the Fibonacci numbers, commonly denoted as fn, is a sequence such that each number is the sum of the two preceding numbers, starting with 1 and 1. That is, f 1 f_1 f1=1, f 2 f_2 f2=1and f n f_n fn= f n − 2 f_{n−2} fn2+ f n − 1 f_{n−1} fn1 (n≥3).
Thus, the beginning of the sequence is 1,1,2,3,5,8,13,21,….

Given n{n}n, please calculate ∑ i = 1 n \sum_{i=1}^n i=1n ∑ j = i + 1 n \sum_{j=i+1}^n j=i+1ng( f i f_i fi, f j f_j fj) , where g(x,y)=1when x⋅y is even, otherwise g(x,y)=0.

输入描述:

The only line contains one integer n(1≤n≤109).

输出描述:

Output one number – ∑ i = 1 n \sum_{i=1}^n i=1n ∑ j = i + 1 n \sum_{j=i+1}^n j=i+1ng( f i f_i fi, f j f_j fj)

示例1
输入

3

输出

2

示例2
输入

10

输出

24

示例3
输入

100

输出

2739

题解
题意:
将当前斐波那契数分别与其后到n的数相乘,值为偶数总和加一。
先举几个
例一:
1 1 2   3 5 8
与其后相乘为偶的个数
2 2 3   1 1 0
例二:
1 1 2   3 5 8   13 21 34
与其后相乘为偶的个数
3 3 6   2 2 3   1  1  0
例三:
1 1 2   3 5 8   13 21 34   55
与其后相乘为偶的个数
3 3 6   2 2 3   1  1  0    0
   +1      +1		 +1
3 3 7   2 2 4   1  1  1    0
例四:
1 1 2   3 5 8   13 21 34   55 89
与其后相乘为偶的个数
3 3 6   2 2 3   1  1  0    0  0
   +2      +2		 +2
3 3 8   2 2 5   1  1  2    0  0

细心的同学是不是已经发现规律了呢(#^.^#)

若想让x*y为偶,只需其中一个为偶数,
当我们从上面的例子观察就不难发现,每3个数中就会有一个数是偶数
定义 ou记录有几组这样的数,op记录余下数(奇数)
拿例二来看:
1 1 2   3 5 8   13 21 34
与其后相乘为偶的个数
3 3 6   2 2 3   1  1  0
从第一组往后各组中的奇数能匹配的偶数成等差数列
求和即为 ou*(ou+1)/2
每组中两个奇数匹配的偶数数量是相同的 *2
所以奇数向后能匹配的偶数就有ou*(ou+1)

同样偶数与其后的奇数匹配的情况就是
ou*op + (ou-1)*3*ou/2
代码
#include
#define ll long long
using namespace std;
ll n,ans,ou,op;
int main()
{
	scanf("%lld",&n);
	op = n%3;
    ou = n/3;
	ans=ou*(ou+1) + ou*op + (ou-1)*3*ou/2;
	printf("%lld\n",ans);
}

你可能感兴趣的:(icpc,icpc,c++,算法)