栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Fibonacci(第45届ICPC区域赛上海站)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Fibonacci(第45届ICPC区域赛上海站)


思路
Fibonacci数列

1 1 2   3 5 8   13 21 34

可以发现Fibonacci数列是

奇奇偶 奇奇偶 奇奇偶

每三个数中有一个偶数,所以偶数的个数为k = n / 3

奇数的个数为 s = n - k

例:
1 1 2   3 5 8   13 21 34

每一个数与其后面的数相乘为偶数的个数 
  
3 3 6   2 2 3    1  1  0

因此

奇数与后面的偶数相乘所得结果才是偶数,而且是依次减1

所以我们可以得出

前为奇数、后为偶数相乘为偶数的个数为首项为1,最后一项为k,等差为1的等差数列

即:k*(k+1)/2

因为每三个数中有两个奇数,故乘2

即:k*(k+1)


前为偶数和后面的数(奇数或偶数)相乘为偶数

第一个偶数有n − 3 个

第二个有n−3∗2个组合

第三个有n−3∗3个组合

....

直到最后一个有n−3∗k个组合

等差数列求和:(k*(2*n-3*(k+1)))/2

最终结果: 两个结果相加即可

即:k*(k+1)+(k*(2*n-3*(k+1)))/2
代码
#include
#include
#include
using namespace std;
int main()
{
    long long n,k,s,s1,s2;
    scanf("%lld",&n);
    k=n/3;
    s=n-k;
    s1=k*(k+1);
    s2= (k*(2*n-3*(k+1)))/2;
    printf("%lldn",s1+s2);
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/589883.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号