codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质
E. Anniversary
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
There are less than 60 years left till the 900-th birthday anniversary of a famous Italian mathematician Leonardo Fibonacci. Of course, such important anniversary needs much preparations.
Dima is sure that it’ll be great to learn to solve the following problem by the Big Day: You’re given a set A, consisting of numbers l, l + 1, l + 2, …, r; let’s consider all its k-element subsets; for each such subset let’s find the largest common divisor of Fibonacci numbers with indexes, determined by the subset elements. Among all found common divisors, Dima is interested in the largest one.
Dima asked to remind you that Fibonacci numbers are elements of a numeric sequence, where F1 = 1, F2 = 1, Fn = Fn - 1 + Fn - 2 for n ≥ 3.
Dima has more than half a century ahead to solve the given task, but you only have two hours. Count the residue from dividing the sought largest common divisor by m.
Input
The first line contains four space-separated integers m, l, r and k (1 ≤ m ≤ 109; 1 ≤ l < r ≤ 1012; 2 ≤ k ≤ r - l + 1).
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d specifier.
Output
Print a single integer — the residue from dividing the sought greatest common divisor by m.
Examples
inputCopy
10 1 8 2
outputCopy
3
inputCopy
10 1 8 3
outputCopy
1
题意很简单,就是给你第L到第R个斐波那契额数列,让你选K个求K个数的最大公约数模MOD;
在这里首先要明确性质,斐波那契数列第K个数与第S个数的最大公约数是,第N个斐波那契数,N为S与K的最大公约数。
所以这个题转化为先求N选K的最大公约数+矩阵快速幂求斐波那契,N选K的数的最大公约数,因为K是连续的,所有有这个性质,每N个数一定有一个N的倍数,这是后应该判断K与区间长度的关系,再判断L与R,与N的关系,选取最大值即为K组的最大公约数。
带入最大公约数到矩阵快速幂即可。
矩阵快速幂 https://blog.csdn.net/weixin_43627118/article/details/97394804
#include<bits/stdc++.h>
using namespace std;
int MOD=1e8+5;
const int maxn=2; //定义方阵的阶数
struct JZ{ long long m[maxn][maxn]; };//定义maxn阶方阵
JZ muti(JZ a,JZ b,int mod);
JZ quick_mod(JZ a,long long k,int mod);
bool chk(long long u, long long L, long long R, long long K) {
if(u == 0) {
return 0;
}
return (R / u) - ((L - 1) / u) >= K;
}
int main()
{
long long L,R,K;
cin >> MOD >> L >> R >> K;
long long te = 0;
for(long long i = 1; i * i <= R; i++) {
if(chk(i, L, R, K)) {
te = max(te, i);
}
}
for(long long bs = 1; bs * bs <= R; bs++) {
if(chk(R / bs, L, R, K)) {
te = max(te, R / bs);
}
}
for(long long bs = 1; bs * bs <= L - 1; bs++) {
if((chk(((L - 1) / bs) - 1, L, R, K))) {
te = max(te, ((L - 1) / bs) - 1);
}
}
JZ demo,ans;
demo.m[0][0]=0; demo.m[0][1]=1; demo.m[1][0]=1; demo.m[1][1]=1;
ans=quick_mod(demo,te,MOD);
cout<<ans.m[1][0]<<endl;
}
JZ muti(JZ a,JZ b,int mod)
{
JZ temp;
memset(temp.m,0,sizeof(temp.m));
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++){
for(int k=0;k<maxn;k++)
{
temp.m[i][j]+=(long long) a.m[i][k]*b.m[k][j]%mod;
}
temp.m[i][j]%=mod;
}
return temp;
}
JZ quick_mod(JZ a,long long k,int mod)
{
JZ ans;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
ans.m[i][j]=(i==j);
while(k) {
if(k &1) ans =muti(ans,a,mod);
a = muti(a,a,mod);
k >>=1;
}
return ans;
}
codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质的更多相关文章
- POJ 3070(求斐波那契数 矩阵快速幂)
题意就是求第 n 个斐波那契数. 由于时间和内存限制,显然不能直接暴力解或者打表,想到用矩阵快速幂的做法. 代码如下: #include <cstdio> using namespace ...
- CodeForces 227E Anniversary (斐波那契的高妙性质+矩阵快速幂)
There are less than 60 years left till the 900-th birthday anniversary of a famous Italian mathemati ...
- UVA - 10689 Yet another Number Sequence (矩阵快速幂求斐波那契)
题意:已知f(0) = a,f(1) = b,f(n) = f(n − 1) + f(n − 2), n > 1,求f(n)的后m位数. 分析:n最大为109,矩阵快速幂求解,复杂度log2(1 ...
- poj3070矩阵快速幂求斐波那契数列
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13172 Accepted: 9368 Desc ...
- HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- poj3070 求斐波那契数列第n项 ——矩阵快速幂
题目:http://poj.org/problem?id=3070 用矩阵快速幂加速递推. 代码如下: #include<iostream> #include<cstdio> ...
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]
/* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 斐波那契数列第N项f(N)[矩阵快速幂]
矩阵快速幂 定义矩阵A(m*n),B(p*q),A*B有意义当且仅当n=p.即A的列数等于B的行数. 且C=A*B,C(m*q). 例如: 进入正题,由于现在全国卷高考不考矩阵,也没多大了解.因为遇到 ...
随机推荐
- webpack配置示例
var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('commo ...
- Linux 文件管理篇(三 属性管理)
可读 r 可写 w 可执行 x 档案属性: 第一栏:执行list -al后第一栏的十个标志[1 - 10] 1: d 目录 - 档案 l 连 ...
- 智能指针 unique_ptr
unique_ptr 不共享它的指针.它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法. 1.不能进行复制构造和赋值操作(unique ...
- [科普向] Roguelike游戏到底是什么?
简单的说 Roguelike 是 RPG(角色扮演游戏)的一个分支,也是最重要的一个分支.这个名字源于 1980 年发布的著名电子游戏<Rogue>.按字面上理解,Roguelike 就是 ...
- AJ学IOS 之ipad开发qq空间项目横竖屏幕适配
AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ...
- 如何使用python在短时间内寻找完数
完数:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该数 ...
- linux sysbench : CPU性能测试详解
1.sysbench基础知识 sysbench的cpu测试是在指定时间内,循环进行素数计算 素数(也叫质数)就是从1开始的自然数中,无法被整除的数,比如2.3.5.7.11.13.17等.编程公式:对 ...
- calculator.py
代码如下: #计算器类 class Count: def __init__(self, a, b): self.a = int(a) self.b = int(b) #计算器加法 def add(se ...
- 配置CORS代理请求
参考资料: Vue-CLI 3.x 跨域问题处理 使用代理设置:见官方文档 配置代理 新建配置文件 在 package.json 文件的同级目录下创建 vue.config.js 文件,文件的格式应该 ...
- 11. this.setState更新问题
this.setState是异步的,所以在this.setState之后不能立刻得到最新的state数据关于如何获取最新的数据,有如下三种方法 1.回调函数 this.setState({ xxx:' ...