NOI2016 山西省省选 第二题序列

给出一个n(n<=10^18)然后把n拆成若干个数之和(3=1+2=2+1 是两种情况) 然后把这写数字当作斐波那契数列的下标相乘再相加

例如:

3=1+1+1=1+2=2+1=3

所以结果就是

F1*F1*F1+F1*F2+F2*F1+F3=5

首先先试一试,找规律

不难发现

Gn=2*Gn-1+Gn-2

但是10^18次方比较猥琐 纯递推貌似只能得70

然后考虑矩阵乘法

构建一个矩阵用来递推

2 1

1 0

就可以了 ,比较类似poj3070那倒题

//这是一个有趣的斐波那契数列的计算,矩阵乘法加速递推   这样子可以混搭快速幂 速度高 10^18次
//应该能过
/*
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n;
void cheng (int a[2][2],int b[2][2])
{
    int c[2][2];
    memset(c,0,sizeof(c));
    for (int i=0;i<2;i++)
        for (int j=0;j<2;j++)
          for (int k=0;k<2;k++)
              c[i][j]=(c[i][j]+a[i][k]*b[k][j])%10000;
    memcpy(a,c,sizeof(c));
}
int main()
{
    while (cin>>n && n!=-1)
    {
        int f[2][2]={{0,1},{0,0}};
        int a[2][2]={{0,1},{1,1}};
        while (n>0)
     {
         if(n&1) cheng(f,a);
         cheng (a,a);
         n>>=1;
     }
      printf("%d\n",f[0][0]);
    }
}
*/

//稍微改一改 其实数据再多一点的话unsigned long long 估计就会炸了就需要用高精度了 

#include <cstdio>
#include <iostream>
#include <cstring>
#define MOD 1000000007
using namespace std;
unsigned long long n;
long long f[2][2]={{1,0},{0,0}};
long long a[2][2]={{2,1},{1,0}};
void cheng (long long a[2][2],long long b[2][2])
{
    long long c[2][2];
    memset(c,0,sizeof(c));
    for (int i=0;i<2;i++)
        for (int j=0;j<2;j++)
          for (int k=0;k<2;k++)
              c[i][j]+=((a[k][j]%MOD)*(b[i][k]%MOD))%MOD;
    memcpy(a,c,sizeof(c));
}
int main()
{
    cin>>n;
    if (n==0){
        printf("0\n");
        return 0;
    }
    --n;
    while (n)
    {
         if(n&1) cheng(f,a);
         cheng (a,a);
         n>>=1;
    }
    printf("%d\n",f[0][0]);
}

就这样就可以了 ,但貌似考场上程序忘了处理0的情况了/泪目

时间: 2024-10-12 12:52:46

NOI2016 山西省省选 第二题序列的相关文章

第二题等差素数列

第二题 标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. #include<iostre

(hdu step 8.1.2)Train Problem I(站的基本应用——判断一个序列经过栈后是否能够得到第二个序列)

题目: Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 78 Accepted Submission(s): 60   Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A l

jsp大学作业:jsp编写单选,复选判断题及得分情况

project_1_1.jsp 1 <%@ page contentType="text/html;charset=utf-8" language="java" %> 2 <html> 3 <head> 4 <title>project_1</title> 5 </head> 6 <body> 7 <form action="project_1_2.jsp"

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT)

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT) 题意: n 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 m 次方,求所有可能的图的权值和. 考虑\(dp[i][j]\)表示\(j\)个点,权值为\(i\)次方 我们首先要预处理出\(n\)个点无向联通图的数量\(g[i]\),模板题:BZOJ-3456 题解 对于\(dp[i][j]\),枚举\(1\)号点所在的连通块大小为\(x\),那么可以得到的是\(dp[i][j]=\sum dp[k][j-x]

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

Learning Perl 第九章习题第二题

把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法 Learning Perl 第九章习题第二题,布布扣,bubuko.com

2014百度之星资格赛第二题

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2560    Accepted Submission(s): 366 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.

NOIP2005-普及组复赛-第二题-校门外的树

题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入输出