当前位置: 首页 > news >正文

PAT乙级(Basic Level)练习题-NowCoder数列总结

题目描述


NowCoder最近在研究一个数列:

  • F(0) = 7
  • F(1) = 11
  • F(n) = F(n-1) + F(n-2) (n≥2)
    他称之为NowCoder数列。请你帮忙确认一下数列中第n个数是否是3的倍数。

输入描述:

输入包含多组数据。
每组数据包含一个整数n,(0≤n≤1000000)。


输出描述

对应每一组输入有一行输出。
如果F(n)是3的倍数,则输出“Yes”;否则输出“No”。
---

输入例子:

0
1
2
3
4
5

输出例子:

No
No
Yes
No
No
No
---

题目分析

这是一个特殊初始条件的Fibonacci sequence.

1.初始条件n的值比较小,可以直接枚举每个F(n)的值,然后输入n查询:

#include <iostream>  
#include <cstdio>  
using namespace std;  
int main (){  
    int n;  
    int *a=new int[N];
    a[0]=7;
    a[1]=11;
    for(int i=2;i<N;i++)
        a[i]=a[i-2]%3+a[i-1]%3;
    while(~scanf("%d", &n)){
        cout<<a[n]<<endl;
        if(a[n]%3==0)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;   
    }
    return 0;  
}  

2.可以寻找到规律:(牛客网友“我要过pat”提供)

998904-20180930172632764-1888343934.png

这个真牛批,想不到还有这种规律。那Fibonacci数列是否有相似的规律呢?

#include <iostream>  
using namespace std;

int main (){  
    int n;  
    while(cin>>n){
    if((n-2)%4==0)
        cout<<"Yes"<<endl;
    else 
        cout<<"No"<<endl;
    }
    return 0;  
}  

3.用矩阵快速幂来求解,这题n的范围比较小(0≤n≤1000000)所以用第1种方法可以不超时求解,但是,倘若n很大,达到(1<=n<=1000,000,000,000,000,000)这个范围,那么显而易见,必定超时。而且根本开不到那么大的数组。学校的算法课,有另外一题类似的,可以思考一下:

998904-20180930173215801-822411130.png

借此思路,用矩阵快速幂计算,稍微修改下就可以了。

 #include <iostream>  
#include <cstdio>  
#include <cstring>  
#define N 3
#define maxn 2   
  
  
using namespace std;  
  
struct Matrix{  
    long long a[maxn][maxn];  
    void init(){    //初始化为单位矩阵   
        memset(a, 0, sizeof(a));  
        for(int i=0;i<maxn;++i){  
            a[i][i] = 1;  
        }  
    }  
};  
  
//矩阵乘法   
Matrix mul(Matrix a, Matrix b){  
    Matrix ans;  
    for(int i=0;i<maxn;++i){  
        for(int j=0;j<maxn;++j){  
            ans.a[i][j] = 0;  
            for(int k=0;k<maxn;++k){  
                ans.a[i][j] += a.a[i][k] * b.a[k][j];  
                ans.a[i][j] %= N;   
            }  
        }  
    }   
    return ans;  
}  
  
//矩阵快速幂   
Matrix qpow(Matrix a, long long n){  
    Matrix ans;  
    ans.init();  
    while(n){  
        if(n&1)   
            ans = mul(ans, a);  
        a = mul(a, a);  
        n /= 2;  
    }   
    return ans;  
}  
  


int main (){  
    long long n;  
  
    while(~scanf("%lld", &n)){
    Matrix a;  
    a.a[0][0] = 1;  
    a.a[0][1] = 1;  
    a.a[1][0] = 1;  
    a.a[1][1] = 0;  
    long long s0=7,s1=11;   
    if (n>1)  
        {  
        Matrix ans= qpow(a, n-1);  
        long long res=ans.a[0][0]*s1+ans.a[0][1]*s0;  
//        printf("%lld",res); 
        if(res%3==0)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;   
        }             
    else  
        cout<<"No"<<endl;   
        
        
    }
    return 0;  
}  

测评网站真的恶心,有时候循环输入用"cin>>"就可以,有时候又超时。。。得改"成~scanf("%lld", &n)"。另外一开始没想到对中间结果对3取模,导致数值过大溢出。用到unsigned long long 都不够。。。

PS:检测一个数被3整除的算法

1.检测一个数能否被3整除----位运算

如果所有的偶数位出现1的次数为 even_count, 奇数位出现1的次数为 odd_count,两者只差如果是3的倍数,那么这个数就是3倍数。

2.不用除法和求模运算,判断一个数能否被3整除

现在给出一个数a,假设它能被3整除,结果是b,即a=3*b,那么从二进制乘法运算判断出,b的最低位与a的最低位一定是相同的,从而得到了b的最低位,将这个位左移1位变成次低位,那么a的次低位以上的比特减去这个位后在次低位上的结果一定是b的次低位。以此类推可以求出b的各个比特,如果最后能完成对b的各位的计算,那么a能够被3整除,否则不能被3整除。

那么算法原理是什么呢?

转载于:https://www.cnblogs.com/cafe3165/p/9732826.html

相关文章:

  • KVO知识点
  • Selenium 对窗口对HTML的操作举例
  • 设计模式(十五)[结构模式] 合成模式(Composite)
  • Spring框架5.1将提供对Java 11的支持
  • Uber开源Marmaray:基于Hadoop的通用数据摄取和分散框架
  • LeetCode - 141. Linked List Cycle
  • kubernetes[2]-Pod
  • @jsonView过滤属性
  • vmware创建centos虚拟机
  • 福大软工1816 · 第六次作业 - 团队选题报告
  • 尝试解决微信小程序分页最后setData数据太大限制的问题
  • teragen/terasort_简化版
  • 云计算节点故障自动化运维服务设计
  • Redis 中的布隆过滤器
  • git操作:在CentOS7上面搭建GitLab服务器
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【技术性】Search知识
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Cookie 在前端中的实践
  • cookie和session
  • Javascript基础之Array数组API
  • jquery cookie
  • springMvc学习笔记(2)
  • 从重复到重用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于字符编码你应该知道的事情
  • 排序算法学习笔记
  • 前端js -- this指向总结。
  • 前端路由实现-history
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 试着探索高并发下的系统架构面貌
  • 数据可视化之 Sankey 桑基图的实现
  • 用Visual Studio开发以太坊智能合约
  • hi-nginx-1.3.4编译安装
  • MyCAT水平分库
  • ​Spring Boot 分片上传文件
  • $NOIp2018$劝退记
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)负载均衡,回话保持,cookie
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET文档生成工具ADB使用图文教程
  • .Net下的签名与混淆
  • .net与java建立WebService再互相调用
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @EnableWebMvc介绍和使用详细demo
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @Transactional 详解
  • @在php中起什么作用?
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...