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<iostream>
#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);
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我张小明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值