NOIP欢乐模拟赛 T2 解题报告

小澳坐标系行走问题

小澳的坐标系

coordinate.cpp/c/pas

题目描述

小澳者表也,数学者景也,表动则景随矣。

小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过。

小澳的梦境中出现了一个平面直角坐标系,自原点,向四方无限延伸。

小澳在坐标系的原点,他可以向上、向左或者向右走。他可以走n步,但不能经过相同的点

小澳想知道他有多少种走法。

 

输入格式

输入文件名为coordinate.in。

输入文件仅第一行一个正整数n,表示小澳可以走的步数。

 

输出格式

输出文件名为coordinate.out。

输出文件共一行,输出一个正整数,表示答案(对10^9+7取模)。

 

输入输出样例1

coordinate.in

coordinate.out

2

7

 

【输入输出样例1说明】

从(0,0)出发走2步,共7种走法:

(0,0)->(0,1)->(0,2)

(0,0)->(0,1)->(1,1)

(0,0)->(0,1)->(-1,1)

(0,0)->(1,0)->(2,0)

(0,0)->(1,0)->(1,1)

(0,0)->(-1,0)->(-2,0)

(0,0)->(-1,0)->(-1,1)

 

输入输出样例2

coordinate.in

coordinate.out

3

17

 

 

数据规模与约定

测试点编号

n

1~2

n<=10

3~4

n<=100

5~6

n<=1000

7~8

n<=10^6

9~10

n<=10^9

 

————————————————————————分割线————————————————————————

分析:

看到这道题不难想到他的递推式

在上图,蓝点表示只有两种走法的点,红点表示三种走法的点,红蓝相间表示两种都有。

普通递推式如下 ( 80分 ):

F[i][0]=F[i-1][0]+F[i-1][1]*2

F[i][1]=F[i-1][0]+F[i-1][1] 

 

 1 #include "bits/stdc++.h"
 2 
 3 using namespace std ;
 4 typedef long long QAQ ;
 5 const int MOD = 1e9 + 7 ;
 6 
 7 int main ( ) {
 8         QAQ t1 = 1 , t2 = 3 , t3 = 3 , N ;
 9         cin >> N ;
10         --N ;
11         for ( int i=1 ; i<=N ; ++i ) {
12                 t3 = ( t2 - t1 ) * 2 + t1 * 3 ;
13                 t1 = t2 ;
14                 t2 = t3 ;
15         }    
16         cout << t3 << endl ;
17         return 0 ;
18 }
View Code

 

但是,我们发现每一步只与上一步有关,可以建立递推关系,构造矩阵+快速幂解决。( AC )

 

 

 1 #include "bits/stdc++.h"
 2  
 3 using namespace std;
 4 typedef long long QAQ ;
 5 const int MOD = 1e9 + 7 ;
 6 
 7 struct Matrix{
 8         QAQ v[2][2];
 9         Matrix ( ) { memset ( v , 0 , sizeof ( v ) ) ; }
10 }base , ans ;
11 
12 Matrix operator*( Matrix x , Matrix y ) {
13         Matrix res;
14         for(int i=0;i<2;i++)
15         for(int j=0;j<2;j++)
16         for(int k=0;k<2;k++)
17                 (res.v[i][j]+=(x.v[i][k]*y.v[k][j]%MOD))%=MOD;
18         return res;
19 }
20 
21 int main ( ) {
22         int N ;
23         scanf ( "%d" , &N ) ; 
24         ans.v[ 0 ][ 0 ] = 1 ;
25         base.v[ 0 ][ 0 ] = base.v[ 0 ][ 1 ] = base.v[ 1 ][ 1 ] = 1 ;
26         base.v[ 1 ][ 0 ] = 2 ;
27         for ( int i=N + 1 ; i ; i>>=1 , base = base * base )
28                 if  ( i & 1 ) ans = ans * base ;
29         printf( "%I64d\n" , ans.v[0][0] ) ;
30         return 0 ;
31 }
Matrix

2016-10-03 21:42:08 

 PS:本题可以进一步化简递推,可得 f ( n ) = 2 * f ( n - 1 ) + f ( n - 2 ) ,也可得到答案。

(完)

 

转载于:https://www.cnblogs.com/shadowland/p/5929581.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值