比较无聊的题,求斐波那契数的第N^M项。 f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2),结果对10000103取模。 N, M在[0..10^7]之间。要求复杂度:时间O(log(N * M)),空间O(1)。

分析: fib数取模有周期,并且对质数的周期一定是从最开头开始。也就在对P取模下,一定有f(T) == f(0)。关于周期的求法有原根之类的方法……但是本题直接暴力就行。算得

T = 20000208。后面就是矩阵乘方了。

代码:

// you can also use includes, for example:
// #include <algorithm> #include <vector>
const int MOD = 10000103;
const int T = 20000208; int mul(long long x,long long y,int M) {
return x * y % M;
} int add(int x,int y,int M) {
return ((x += y) < M)?x:(x - M);
} void mulmatrix(int a[2][2],int b[2][2],int c[2][2]) {
int i,j,k;
for (i = 0; i < 2; ++i) {
for (j = 0; j < 2; ++j) {
c[i][j] = 0;
for (k = 0; k < 2; ++k) {
c[i][j] = add(c[i][j], mul(a[i][k], b[k][j], MOD), MOD);
}
}
}
} void make(int a[2][2],int b[2][2]) {
int i,j;
for (i = 0; i < 2; ++i) {
for (j = 0; j < 2; ++j) {
a[i][j] = b[i][j];
}
}
} int solution(int N, int M) {
// write your code here...
/*int T;
vector<int> f;
f.push_back(0);
f.push_back(1);
for (T = 2; ; ++T) {
f.push_back(add(f[T - 1], f[T - 2], MOD));
if ((f[T] == 1) && (f[T - 1] == 0)) {
--T;
break;
}
}
return T;*/
int p = 1, x = N;
for (; M; M >>= 1) {
if (M & 1) {
p = mul(p,x,T);
}
x = mul(x,x,T);
}
if (p-- == 0) {
return 0;
}
int a[2][2],b[2][2],c[2][2];
a[0][0] = a[1][1] = b[0][1] = b[1][0] = b[1][1] = 1;
a[0][1] = a[1][0] = b[0][0] = 0;
for (; p; p >>= 1) {
if (p & 1) {
mulmatrix(a, b, c);
make(a, c);
}
mulmatrix(b, b, c);
make(b, c);
}
return a[1][1]; }

Codility上的问题 (16) Omicron 2012的更多相关文章

  1. codility上的问题 (21) Upsilon 2012

    这是我目前最喜欢的codiltiy上的问题之一.问题描述是:给定一个整数数组A,所有的数均不相同.假设下标从0开始,找到一个数组B, 满足A[B[0]] > A[B[1]] > A[B[2 ...

  2. codility上的问题(15) Xi 2012

    进入2012年的题 codility上的题目开始变难,变得有意思起来.给定两个长度在[1..300000]的只包含0和1的串S和T,它们是2进制表示的,S表示的数A不大于T表示的数B,即A<=B ...

  3. codility上的练习 (1)

    codility上面添加了教程.目前只有lesson 1,讲复杂度的……里面有几个题, 目前感觉题库的题简单. tasks: Frog-Jmp: 一只青蛙,要从X跳到Y或者大于等于Y的地方,每次跳的距 ...

  4. codility上的问题 (19)Sigma 2012

    题目: 像最大直方图一样给定一个数组是每个单位长度上的高度,求至少几个矩形可以拼出这个形状. 例如:给出的数组 H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 ...

  5. codility上的问题(18) Rho 2012

    从正整数1开始,产生一个数列,数列中的每个数是之前出现过的任意两个数的和(可以相等),问产生正整数A,需要的数列长度至少是多少?返回这样一个最短的序列. 例如A=42 可以这样[1, 2, 3, 6, ...

  6. codility上的问题 (23)Chi 2012

    这个题也比较有意思.意思是给定一个数组A,长度为M,里面都是正整数,代表每块地形的高度.现在要测试一种加农炮,给定一个炮弹的高度H, 如果存在最小的I,满足0 < I <  M,满足A[I ...

  7. Codility上的问题 (17) PI 2012

    这个题比较简单,给定一个整数数组,对每个元素,求出和它最近比它大的数的距离(下标绝对值),如果没有比它大的数,认为距离是0. 数组元素个数 N [0..50000],数组元素范围[-10^9, +10 ...

  8. codility上的练习(5)

    codility出了lesson 5了. (1) 合法括号序列,包括( [ { ) ] }这6种字符的字符串,长度N在[0..200000]范围内,为其是否合法. 要求时间复杂度O(N),空间复杂度O ...

  9. 在XPS13 上安装Ubuntu 16.04

    1 准备系统安装U盘 使用常见的光盘工具软件ultraISO. (1)首先使用UltraISO打开Ubuntu-16.04.4-desktop-amd64.iso安装映像. (2)在菜单栏中,选择&q ...

随机推荐

  1. Aqua Data Studio 查询结果中文乱码

    菜单条里[文件]-[选项]会弹出个选项对话框 然后选[一般]  在右边的[外观]以下找到[网格结果字体] 将字体类型改成宋体即可了 watermark/2/text/aHR0cDovL2Jsb2cuY ...

  2. MYSQL - php 使用 localhost 无法连接数据库

    php 使用 localhost 无法连接数据库,而使用127.0.0.1却能连接成功. 可能原因: 系统hosts文件未提供127.0.0.1到localhost的解析.解决方法(以win7系统为例 ...

  3. ViewPager实现广告自动轮播核心代码(Handler+Thread)

    ViewPager数据源是4个线性布局,每个布局里面充满一张高度固定.宽度充满父布局的图片.有4个小圆点跟随ViewPager滑动.轮播原本我是用Timer+TimerTask的,但是问题颇多,很是郁 ...

  4. pkg_zhgl

    CREATE OR REPLACE PACKAGE BODY PKG_ZHGL AS --账户管理包 code szn 20110829 --账户管理服务包 --定义本包中需要引用到的常量 --定义说 ...

  5. XCode 6 出现 no identity found: Command /usr/bin/codesign failed with exit code 1 解决方法汇总

    1, 解决办法,进入开发者账号重建一个 Provisioning Profiles(或配套证书) 文件,把证书添加正确就可以了 (应该是最有效的) 2, 将p12文件重新安装下 3, 在 iPhone ...

  6. 基于visual Studio2013解决算法导论之013基数排序

     题目 基数排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  7. Java 实现享元(Flyweight)模式

    /** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...

  8. UVa 725暴力求解

    A - Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su Description   Writ ...

  9. 小记:css特殊性

    今天早上遇到了个小bug,刚好用从css权威指南学到的知识解决了 html结构 <ul class="portlet-nav"> <li><a id= ...

  10. 基于visual Studio2013解决C语言竞赛题之0703乾坤大挪移

       题目