数列-训练套题T10T3

本文介绍了一种使用树状数组解决特定数列问题的方法。该问题是寻找满足特定条件的三元组数量,即数列中存在ai<aj>ak且i<j<k的情况。通过两次遍历数列并利用树状数组高效统计满足条件的元素数量,最终以long long型变量存储结果。

**只是做个笔记
本题可用树状数组做
注意最后的结果用long long 型的变量存储
**数列(sequence.pas/c/cpp)

  • 问题描述
    一个简单的数列问题:给定一个长度为n的数列,求这样的三个元素ai, aj, ak的个数,满足ai < aj > ak,且i < j < k。
  • 输入数据
    第一行是一个整数n(n <= 50000)。
    第二行n个整数ai(0 <= ai <= 32767)。
  • 输出数据
    一个数,满足ai < aj > ak (i < j < k)的个数。
  • 样例输入
    5
    1 2 3 4 1
  • 样例输出
    6****
#include<bits/stdc++.h>

using namespace std;
#define lowbit(i) ((i)&(-i))
const int MAXN=50010;
const int MAXA=32797;
int c1[MAXA],c2[MAXA];
int num1[MAXN],num2[MAXN];
int a[MAXN];
void update(int x,int v,int c[]){
	for(int i=x;i<MAXA;i+=lowbit(i)){
		c[i]+=v;
	}
}
int get_sum(int x,int c[]){
	int sum=0;
	for(int i=x;i>0;i-=lowbit(i)){
		sum+=c[i];
	}
	return sum;
}
int main(){
	int n;
	scanf("%d",&n);
	memset(c1,0,sizeof(c1));
	memset(c2,0,sizeof(c2));
	memset(num1,0,sizeof(num1));
	memset(num2,0,sizeof(num2));
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i]++;		
	}
	for(int i=1;i<=n;i++){
		update(a[i],1,c1);
		num1[i]=get_sum(a[i]-1,c1);
	}
	for(int i=n;i>=1;i--){
		update(a[i],1,c2);
		num2[i]=get_sum(a[i]-1,c2);
	}
	long long sum=0;
	for(int i=1;i<=n;i++){
		sum+=num1[i]*num2[i];
	}
	printf("%lld\n",sum);
	return 0;		
} 
### 蓝桥杯 Python 类斐波那契数列思路及代码实现 #### 目背景 蓝桥杯竞赛中涉及了许多与斐波那契数列及其变种相关的目。这些目通常考察选手对于动态规划、循环结构以及取模运算的理解和应用能力。 --- #### 解思路分析 1. **传统斐波那契数列** 传统的斐波那契数列定义如下: \[ F(0) = 0,\quad F(1) = 1,\quad F(n) = F(n-1) + F(n-2)\ (n\geq 2) \] 对于此类问,可以通过简单的迭代方法来解决[^3]。 2. **新型斐波那契数列** 新型斐波那契数列的定义略有不同:前三项均为 \(1\),从第四项开始每项等于前三项之和。即: \[ T(1) = 1,\quad T(2) = 1,\quad T(3) = 1,\quad T(n) = T(n-1) + T(n-2) + T(n-3)\ (n>3) \] 此外,在某些情况下还需要对结果取模操作以防止数值过大超出范围[^4]。 3. **优化方向** - 使用数组存储中间状态可以方便回溯,但对于大输入可能导致内存占用过高。 - 利用滚动变量代替完整列表保存数据能够有效降低空间复杂度至常量级别。 --- #### 示例代码展示 以下是针对上述两种情况分别给出的具体实现: ##### 方法一:标准斐波那契序列(带取模) 适用于解较大索引位置上的值并对其执行特定模运算的情况。 ```python def fibonacci_mod(n, mod=10007): if n == 1 or n == 2: return 1 % mod a, b = 1, 1 for _ in range(3, n + 1): c = (a + b) % mod a, b = b, c return b # 测试样例 print(fibonacci_mod(10)) # 输出应为55%mod的结果 ``` ##### 方法二:扩展版三阶递推关系式 用于处理更复杂的多步依赖场景下的同余性质研究。 ```python def tribonacci_mod(n, m): if n == 1 or n == 2 or n == 3: return 1 % m t1, t2, t3 = 1, 1, 1 for i in range(4, n + 1): next_val = (t1 + t2 + t3) % m t1, t2, t3 = t2, t3, next_val return t3 # 测试样例 print(tribonacci_mod(10, 10007)) # 计算T(10)%10007 ``` --- #### 注意事项 - 当面对非常庞大的指数增长趋势时,务必考虑采用高效的算法设计策略减少冗余计算次数; - 如果遇到精度丢失或者溢出风险,则需引入高精库函数辅助完成精确表达需---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值