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. MySQL 出现 Access denied for user 'root'@'localhost' (using password: YES) 错误

    登录某台服务器的mysql时候总报错: mysql2/client.rb:58:in `connect': Access denied for user 'root'@'localhost' (usi ...

  2. Secondary IP Addressing

    Secondary IP Addressing secondary IP addressing. Secondary addressing uses multiple networks or subn ...

  3. Linux分区

    硬盘分区主要分为基本分区和扩展分区两种,基本分区和扩展分区的数目之和不能大于四个.且基本分区可以马上被使用但不能再分区.扩展分区必须再进行分区后才能进行使用,也就是说它必须进行二次分区.扩展分区再分下 ...

  4. [原创]pg_shard使用场景及功能测试

    pg_shard是一个PostgreSQL的sharding extension.可以用于Shards.Replicates tables和高可用.它可以在不修改Applications的情况下无缝分 ...

  5. 浅谈HAL

    参考:http://blog.csdn.net/mr_raptor/article/details/8074549 代码实现:http://blog.csdn.net/mr_raptor/articl ...

  6. IOS中 如何去除Tabview里面cell之间的下划线

    可以利用Tabview的separatorStyle属性来设置,选择其中的UITableViewCellSeparatorStyleNone 即可去除cell之间的下划线 self.tableView ...

  7. Swift :?和 !

    Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值, 也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化 .如果在使用变量之前不进行初始化就会报错: v ...

  8. C#语法功能结构

    1.File打开指定文件夹或者文件,"\"为转义字符System.Diagnostics.Process.Start(Application.StartupPath + " ...

  9. Python实现kMeans(k均值聚类)

    Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...

  10. viewport使用 html5

    viewport 语法介绍: 01 02 width 控制 viewport 的大小,可以指定的一个值或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的 ...