Codility上的问题 (16) Omicron 2012
比较无聊的题,求斐波那契数的第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的更多相关文章
- codility上的问题 (21) Upsilon 2012
这是我目前最喜欢的codiltiy上的问题之一.问题描述是:给定一个整数数组A,所有的数均不相同.假设下标从0开始,找到一个数组B, 满足A[B[0]] > A[B[1]] > A[B[2 ...
- codility上的问题(15) Xi 2012
进入2012年的题 codility上的题目开始变难,变得有意思起来.给定两个长度在[1..300000]的只包含0和1的串S和T,它们是2进制表示的,S表示的数A不大于T表示的数B,即A<=B ...
- codility上的练习 (1)
codility上面添加了教程.目前只有lesson 1,讲复杂度的……里面有几个题, 目前感觉题库的题简单. tasks: Frog-Jmp: 一只青蛙,要从X跳到Y或者大于等于Y的地方,每次跳的距 ...
- codility上的问题 (19)Sigma 2012
题目: 像最大直方图一样给定一个数组是每个单位长度上的高度,求至少几个矩形可以拼出这个形状. 例如:给出的数组 H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 ...
- codility上的问题(18) Rho 2012
从正整数1开始,产生一个数列,数列中的每个数是之前出现过的任意两个数的和(可以相等),问产生正整数A,需要的数列长度至少是多少?返回这样一个最短的序列. 例如A=42 可以这样[1, 2, 3, 6, ...
- codility上的问题 (23)Chi 2012
这个题也比较有意思.意思是给定一个数组A,长度为M,里面都是正整数,代表每块地形的高度.现在要测试一种加农炮,给定一个炮弹的高度H, 如果存在最小的I,满足0 < I < M,满足A[I ...
- Codility上的问题 (17) PI 2012
这个题比较简单,给定一个整数数组,对每个元素,求出和它最近比它大的数的距离(下标绝对值),如果没有比它大的数,认为距离是0. 数组元素个数 N [0..50000],数组元素范围[-10^9, +10 ...
- codility上的练习(5)
codility出了lesson 5了. (1) 合法括号序列,包括( [ { ) ] }这6种字符的字符串,长度N在[0..200000]范围内,为其是否合法. 要求时间复杂度O(N),空间复杂度O ...
- 在XPS13 上安装Ubuntu 16.04
1 准备系统安装U盘 使用常见的光盘工具软件ultraISO. (1)首先使用UltraISO打开Ubuntu-16.04.4-desktop-amd64.iso安装映像. (2)在菜单栏中,选择&q ...
随机推荐
- stm32之中断系统
概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...
- JNI之HelloWorld
什么是JNI? JNI java本地开发接口 JNI 是一个协议 这个协议用来沟通java代码和外部的本地代码(c/c++). 通过这个协议,java代码就可以调用外部的c/c++代码 外部的c/c+ ...
- 响应式设计:理解设备像素,CSS像素和屏幕分辨率
概述 屏幕分辨率.设备像素和CSS像素这些术语,在非常多语境下,是可互换的,但也因此easy在有差异的地方引起混淆,实际上它们是不同的概念. 屏幕分辨率和设备像素是物理概念,而CSS像素是WEB编程的 ...
- 在C#中使用C++编写的类1
转载地址:http://blog.csdn.net/starlee/article/details/2864588 现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前 ...
- hibernate 一对多映射
package com.entity.onetomany; import java.util.ArrayList; import java.util.List; import javax.persis ...
- jstl 保留两位小数
简介:jstl保留两位小数实现方法在JSP开头导入以下标签:<%@tagliburi="http://java.sun.com/jsp/jstl/fmt"pre jstl 保 ...
- SQLite数据库框架ORMLite与GreenDao的简单比较
笔记摘要:最近准备使用数据库做个缓存,以前因为项目中的实时性要求比较高,所以在整体的框架中就没有加缓存,有些地方只 是简单的将对象保存到了Preference中,所以并没有对数据库方面有所研究,既然准 ...
- JVM调优总结(三)-基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. ...
- 基于visual Studio2013解决C语言竞赛题之1004平均值
题目 解决代码及点评 /************************************************************************/ /* 4. 编一个程序, ...
- highcharts dynamic change line color
mouseOut: function(){ this.series.graph.attr({"stroke","#ccc"}) }