题目描述


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”提供)

这个真牛批,想不到还有这种规律。那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)这个范围,那么显而易见,必定超时。而且根本开不到那么大的数组。学校的算法课,有另外一题类似的,可以思考一下:

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

 #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整除。

那么算法原理是什么呢?

PAT乙级(Basic Level)练习题-NowCoder数列总结的更多相关文章

  1. 牛客网 PAT乙级(Basic Level)练习题 1023 考新郎

    题目描述 过年期间,老家举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做“考新郎”,具体的操作是这样的: 1. 首先,给每位新娘打扮得几乎一模一样,并盖上大大 ...

  2. C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - P ...

  3. C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ...

  4. 牛客网编程练习之PAT乙级(Basic Level):1033 害死人不偿命的(3n+1)猜想

    3n+1水题.... AC代码: import java.util.Scanner; /** * @author CC11001100 */ public class Main { public st ...

  5. 牛客网编程练习之PAT乙级(Basic Level):1034 写出这个数

    AC代码: import java.util.*; /** * @author CC11001100 */ public class Main { public static void main(St ...

  6. 牛客网编程练习之PAT乙级(Basic Level):1032 选大王

    典型的约瑟夫环问题 AC代码: import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @ ...

  7. 牛客网编程练习之PAT乙级(Basic Level):1041 说反话

    直接分隔取反即可 AC代码: import java.util.Scanner; /** * @author CC11001100 */ public class Main { public stat ...

  8. 牛客网PAT乙级(Basic Level)真题-组个最小数 (20)

    组个最小数 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定数字0-9各若干个.你可以以任意顺序排 ...

  9. 牛客网PAT乙级(Basic Level)真题-数字分类 (20)

    题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4 ...

随机推荐

  1. POJ3801 Crazy Circuits

    嘟嘟嘟 上下界网络流之最小流. 建图不说啦,裸的. 在有附加源\(S\)和附加汇\(T\)的图上跑完后,删除和\(S, T\)相连的边.然后因为可能流多了,所以现在应该退流,于是我们从\(t\)到\( ...

  2. 微信jsapi退款操作

    引自网络“ 前期准备:当然是搞定了微信支付,不然怎么退款,这次还是使用官方的demo.当然网上可能也有很多大神自己重写和封装了demo,或许更加好用简洁,但是我还是不提倡用,原因如下:(1)可能功能不 ...

  3. php 把一个一维数组的值依次赋值到二维数组中的每一项

    Array( [0] => 1 [1] => 4 [2] => 2 [3] => 6 ) Array( [0] => Array ( [field_name] => ...

  4. MP实战系列(十四)之分页使用

    MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...

  5. nginx中server的匹配顺序

    在开始处理一个http请求时,nginx会取出header头中的host,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求. ...

  6. JS 仿腾讯发表微博的效果

    JS 仿腾讯发表微博的效果 最近2天研究了下 腾讯发表微博的效果 特此来分享下,效果如下: 在此分享前 来谈谈本人编写代码的习惯,很多人会问我既然用的是jquery框架 为什么写的组件不用Jquery ...

  7. 多Tomcat多JDK版本的Window服务添加配置方式

    本文所讲的配置方式只适合Windows系统,所牵扯的软件2个解压的jdk,2个解压的tomcat. 1.环境初始化 将两个jdk和tomcat解压到我们指定的目录下.修改两个tomcat的端口:必须修 ...

  8. JavaScript中的箭头函数

    1.定义 箭头函数相当于匿名函数,并且简化了函数定义.箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了.还有一种可以包含多条语句,这时候就不能省略{ ... ...

  9. OpenCV开发环境搭建-并测试一个图像灰度处理程序

    转载地址:http://blog.csdn.net/sjz_iron/article/details/8614070

  10. Android分享到微信和朋友圈的工具类

    1.只要填写上正确的app_id,且引用上该工具类你就能实现分享到朋友圈和分享到微信. 2.需要到微信平台下载jar包,以及注册一个appid import android.content.Conte ...