试题 算法训练 斐波那契串

问题描述

  斐波那契串由下列规则生成:
  F[0] = "0";
  F[1] = "1";
  F[n] = F[n-1] + F[n-2] (n≥2,+表示连接)
  给出一个由0和1构成的串S和一个数n,求出F[n]中S出现的次数。

输入格式

  第一行一个数n。
  第二行一个01串S。

输出格式

  答案。

样例输入

96
10110101101101

样例输出

7540113804746346428

数据规模和约定

  n≤263-1,子串长≤10000,答案≤263-1。

#include<iostream>
#include<string>
using namespace std;

string s;
string s1 = "0";
string s2 = "1";
string s0;
long long n;
long long ans1, ans2, ans;

int main() {
	cin >> n;
	
	cin >> s;
	
	for (int i = 2; i <= 23; i ++) {
		s0 = s2 + s1;
		s1 = s2;
		s2 = s0;
	}
	
	for (int i = 0; i <= (s0.size() - s.size()); i ++) {
		if (s == s0.substr(i, s.size())) {
			ans1 ++;
		}
	}
	
	s0 = s2 + s1;
	s1 = s2;
	s2 = s0;
	
	for (int i = 0; i <= (s0.size() - s.size()); i ++) {
		if (s == s0.substr(i, s.size())) {
			ans2 ++;
		}
	}
	
	for (int i = 25; i <= n; i ++) {
		ans = ans1 + ans2 + 1;
		ans1 = ans2;
		ans2 = ans;
	}
	
	cout << ans;
	
	return 0;
}

总结:

如果直接找是找不到,太大了,找规律

先找能找到的,比如n=23的时候,有几个s,n=24的时候有几个s

因为s本就是斐波那契串的一部分,所以它的数量也是符合斐波那契串的规律,当找到两个的时候,就能通过这两个找到下一个,然后一直循环到n

但是long long如果在main中声明,就会出错

但是在全局中声明,答案就是对的

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python数字游戏算法训练是一种通过编写代码来解决数字游戏问题的训练方法。这些问题通常涉及数字的操作、计算和逻辑推理。下面是一些常见的数字游戏算法训练题目和解决方法: 1. 猜数字游戏:在这个游戏中,程序会随机生成一个数字,然后玩家需要猜测这个数字是多少。程序会根据玩家的猜测给出提示,直到玩家猜对为止。解决这个问题的方法是使用循环和条件判断来不断与玩家交互,直到猜对为止。 2. 数字拼图游戏:在这个游戏中,给定一个乱序的数字序列,目标是通过交换数字的位置,将其按照从小到大的顺序排列。解决这个问题的方法可以使用排序算法,如冒泡排序、插入排序或快速排序等。 3. 数独游戏:数独是一种经典的数字逻辑游戏,目标是在一个9x9的网格中填入数字1-9,使得每一行、每一列和每一个3x3的子网格中的数字都不重复。解决这个问题的方法可以使用回溯算法来逐步填充网格,并通过递归和回溯来找到解决方案。 4. 斐波那契数列:斐波那契数列是一个经典的数学问题,其中每个数字都是前两个数字之和。解决这个问题的方法可以使用递归或循环来计算斐波那契数列的前n个数字。 5. 素数判断:素数是只能被1和自身整除的正整数。解决这个问题的方法可以使用循环和条件判断来判断一个给定的数字是否为素数。 以上只是一些常见的数字游戏算法训练题目和解决方法,实际上还有很多其他类型的数字游戏可以用来进行算法训练。希望这些信息对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值