Problem Description

I think that you might have played the traditional Chinese ring game: The Chinese Linking Rings (here we call its nickname Jiulianhuan —— “九连环”). Well, you say you haven’t played it before? Then you must have seen it before, right? If not seen, come to borrow mine to have a good look at it and enjoy it!

Now, I would like to mention the rules or common sense of Jiulianhuan again.
1)The first ring can put on or down the handles at any time. That is, when the first ring is under the handle, it can climb up the handle within one step, and vice versa.
2)At any moment, you can only operate one ring, on the condition that the ring is operable.
3)If the first k-2 rings are under the handle, and the (k-1)th ring is on the handle, then if the k-th ring is under the handle, you can put it on the handle, and if it is not under the handle, you can put it down the handle.
Seems complicated? But I tried my simplest explanation to you, and I hope its not hard for you to understand. Maybe you have played the game before, and the above is what actually a “step” means in the game.

Input

Given n (not bigger than 108), you are to output the minimum steps it needs to down n well-put rings. There are no more than 100 test cases.

Output

A number a line. Because the number are so huge ,you are to output the result after it mod prime 10007.

Sample Input

1
2
9
1005

Sample Output

1
2
341
0 我承认自己的英语渣!
然后现在标程解:

解题思路:

第一环可以随时取下或者套上

一次只能取下或者套上一环

设要取下的是第k环,那么前k-2环必然在杆下,第k-1环必然在杆上,只有这样第k环才能取下,并且取下之后,第k-1环还在杆上,前k-2环在杆下(套上的规则也是类似)

玩1连环,直接取下,ok;

玩2连环,先下第二环(根据3),然后就相当于解1连环了;

玩3连环,先下第一环,之后第三环可以摘下(也是根据3),这个时候只有第二环孤零零地在杆上,之后我们把第一环套上,问题转化为2连环了;

。。。。。。。。。。。

玩k连环,那么第k环是要解下的,而要解下第k环,我们就要先解下前k-2环,这样在杆上的第k环可以依靠在杆上的第k-1环解下(规则3)。第k环解下之后,杆上只有第k-1环,前k-2环在杆下。如果前k-2环不上去,第k-1环就无法解下。所以我们要上前k-2环(稍微一想就知道,上i个环和下i个环的最少步骤必然是相等的,因为是逆过程)好了,上了前k-2环之后,此时杆上就排好了k-1环接下来怎么办?对,递归!

设f[n]是下n连环的最少步骤。那么,要先下前n-2,然后再下第n,然后安装前n-2,然后下前n-1

所以,f[n]=f[n-2]+1+f[n-2]+f[n-1]

=f[n-1]+2*f[n-2]+1

F[0]=0,f[1]=1

可以矩阵乘法了,如果不嫌麻烦

生成函数。

设G(x)=f[0]+f[1]*x+f[2]*x^2+f[3]*x^3+f[4]*x^4+……+f[n]*x^n+….

那么x*g(x)= f[0]*x+f[1]*x^2+f[2]*x^3+f[3]*x^4+….+f[n-1]*x^n+…

并且2*x^2*g(x)= 2*f[0]*x^2+2*f[1]*x^3+2*f[2]*x^4+.+2*f[n-1]*x^n

第一式减下两式,并且根据递推关系,得

(1-x-2*x^2)G(x)=f[0]+f[1]*x-f[0]*x+x^2+x^3+x^4+….+x^n+…

=x+x^2+x^3+…+x^n+…=x/(1-x) (生成函数x没有实际意义

,所以认为无穷级数收敛)

所以G(x)=(x/(1-x))/(1-x-2*x*x)=x/((1-x)*(1+x)*(1-2*x))

将其展开为c/(ax+b)的形式,得到

G(x)= - ( 1/(1-x)*3/2+1/(1+x)*1/2 )/3+ 1/(1-2*x)*2/3

根据1/(1-x)=1+x+x^2+….+x^n+…

得到f[n]= (2^(n+2)-3-(-1)^n)/6

推导有点耗时呢,用其它方法可以么?

注意到这是一个带有常数的线性递推关系。先求对应线性齐次方程的通解,然后求一个特解,然后组合起来就好了(还记得常微分方程吧,与那个类似)

对应的特征方程是x*x=x+2,两个特征根是2与-1

设f[n]=c1*2^n+c2*(-1)^n+c,代入递推f[n]=f[n-1]+2*f[n-2]+1

那么,因为2和-1是那个特征方程的特征跟,所以c1,c2以及含幂的项都抵消了,所以

c=c+2*c+1

所以c=-1/2,再讲f[0],f[1]代入,解得f[n]= -(-1)^n/6+2^(n+1)/3-1/2,与生成函数的一样。

求出公式之后,把分母变成逆元,把幂模掉phi(p),模平方乘法都不需要,因为p只有10000量级,乘以不到100个数。

--反正我没看懂,太渣了!

然后ORZ月月鸟的矩阵快速米!

构造一个这样的矩阵{1 2 1

1 0 0

0 0 1}

然后矩阵的N次幂就OK了,构造矩阵真是一个大学问;

PS:答案就是矩阵中MP[0][0]+MP[0][2]的值;具体看代码(虽然这是不好的风格,我说不上来)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<string>
using namespace std;
#define inf 19999999
#define N 30000
typedef long long ll;
struct matrix
{
int a[][];
}re,rx;
int n; matrix mul(matrix x,matrix y)//矩阵快速米
{
matrix tep;
memset(tep.a,,sizeof(tep.a));
for (int i=;i<;i++)
for (int j=;j<;j++){
for (int k=;k<;k++)
tep.a[i][j]+=x.a[i][k]*y.a[k][j];
tep.a[i][j]%=;
}
return tep;
} void calc(int n)
{
while (n)
{
if (n&) rx=mul(rx,re);
n>>=;
re=mul(re,re);
}
printf("%d\n",(rx.a[][]+rx.a[][])%);//求值的操作
} int main()
{
while (scanf("%d",&n)!=EOF){
memset(re.a,,sizeof(re.a));
memset(rx.a,,sizeof(rx.a));
re.a[][]=; re.a[][]=; re.a[][]=;//初始矩阵
re.a[][]=; re.a[][]=;
rx.a[][]=; rx.a[][]=; rx.a[][]=;//我构造了一个单位矩阵,方便后面的处理
n--;//-1是因为我们从3开始的
calc(n);
} return ;
}

ORZ能找周期的ZZ,真是什么姿势A题的都有

一道PK赛题的更多相关文章

  1. Hitcon 2016 Pwn赛题学习

    PS:这是我很久以前写的,大概是去年刚结束Hitcon2016时写的.写完之后就丢在硬盘里没管了,最近翻出来才想起来写过这个,索性发出来 0x0 前言 Hitcon个人感觉是高质量的比赛,相比国内的C ...

  2. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)

    http://mp.weixin.qq.com/s?__biz=MzA3MDg0MjgxNQ==&mid=208451006&idx=1&sn=532e41cf020a0673 ...

  3. 做了一道cf水题

    被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...

  4. 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】

    P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...

  5. CSDN 轻松周赛赛题:能否被8整除

    轻松周赛赛题:能否被8整除 题目详情 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除. 输入格式: 多组数据,每组数据是一个非负整数.非负整数的位数不超过10000位. 输出格式 ...

  6. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  7. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  8. O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)

    事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...

  9. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

随机推荐

  1. ubuntu打开 txt 文件乱码

    ubuntu12.04 gedit 打开 windows 分区中的 txt 文件乱码,是因为 ubuntu 和 windows 两个系统的编码不同.解决办法:终端里依次输入以下2 条命令即可: 代码: ...

  2. MHA在线切换过程

    MHA 在线切换是MHA除了自动监控切换换提供的另外一种方式,多用于诸如硬件升级,MySQL数据库迁移等等.该方式提供快速切换和优雅的阻塞写入,无关关闭原有服务器,整个切换过程在0.5-2s 的时间左 ...

  3. JTable的DefaultModel方法getValueAt(a,row)

    行和列都是从0开始索引的,而且不包括netbeans生成的表格头,而是从数据开始,否则就会报错

  4. Java通过SpyMemcached来缓存数据

    配置好Magent+memcached后,很明显数据之间的输入与输出都是通过代理服务器的,magent是做代理服务器的很明显java在memecached的调用驱动在magent同样适用. 这里选择S ...

  5. Android UI 组件 » GifView

    GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片 使用方法: 1-把Gi ...

  6. OpenStack的bridge_sto off的解释

    北京_张华(28620211) 2014/1/27 星期一 11:10:57传统的网络是通过STP协议来避免交换机在二层形成环路,但是对于虚拟交换机,因为有东西向的流量,故将bridge_stp设成o ...

  7. Linux: uid/euid/suid的关系

    三种进程用户的简单解释:三种用户/组ID:uid/gid: 实际用户/组IDeuid/egid: 有效用户/组ID, 进程执行某个应用的用户/组ID.suid/sgid: 设置用户/组ID, 应用所属 ...

  8. MVC4.0 利用IActionFilter实现简单的后台操作日志功能

    首先我们要了解MVC提供了4种常用的拦截器:IActionFilter(Action拦截器接口).IExceptionFilter(异常拦截器接口).IResultFilter(Result拦截器接口 ...

  9. MongoDB学习笔记-查询

    MongoDB中使用find或findOne函数执行查询 find函数 db.c.find()--查询集合c所有 db.c.find({“name”:”zhangsan”}) 注意:查询条件的值必须是 ...

  10. Python实现C4.5(信息增益率)

    Python实现C4.5(信息增益率) 运行环境 Pyhton3 treePlotter模块(画图所需,不画图可不必) matplotlib(如果使用上面的模块必须) 计算过程 st=>star ...