#线性筛,斐波那契数列,GCD#BZOJ 2813 奇妙的Fibonacci
题目
有一个斐波那契数列,满足
\]
多次询问给出一个\(n\)(\(n=(n'*A+B)\bmod C+1\)),问
\]
\(C\leq 10^7\)
分析
考虑\(F_i|F_n\)也就是\(gcd(F_i,F_n)=F_i(i\leq n)\)
根据\(gcd(F_i,F_n)=F_{gcd(i,n)}\)可以知道相当于询问\(i|n\)
当然我还是证明一下吧
首先引理
\]
证明:
\]
\]
\]
以此类推,可以得证
有了这条,还有一个显然的引理就是\(\forall i\in N*,gcd(f_i,f_{i+1})=1\)
想要证明\(GCD\)不容易,一般都是通过更相减损法证明
\]
那么
\]
根据更相减损法和引理推出
那么显然可以通过这样的方法推出\(gcd(F_n,F_m)=F_{gcd(n,m)}\)
注意\(F_0=0\),不然就推不出来
证明写了这么长,那么可以得到答案其实就是
\]
一个是约数个数和,另一个是约数平方的和,分别维护。
先进行质因数分解得出\(n=\prod_{i=1}^k{p_i}^{c_i}\)
那么约数个数和就是\(\prod_{i=1}^k(c_i+1)\)
需要用一个辅助数组表示最小质因数的指数;
约数平方和就是\(\prod_{i=1}^k\frac{{p_i}^{c_i+1}-1}{p_i-1}\)
不需要快速幂,维护最小质因数的答案,用秦九韶算法层层推上去就可以了
可是你的约数平方和会不会爆\(\text{long long}\)??
估摸一下,我觉得不会,大概在\(10^{15}\sim 10^{17}\)这一段吧,
反正构造数据也不会特意卡的是吧
当你兴高采烈的时候会发现有锅,
\(F_2=1\),所以对于奇数要特判
代码
#include <cstdio>
#define rr register
using namespace std;
typedef long long lll;
const int N=10000011,mod=1000000007,M=6700011;
int Cnt,D[N],Mc[N],prime[M]; lll v[N],Si[N],Pp[M];
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void Pro(int n){
v[1]=Si[1]=D[1]=1;
for (rr int i=2;i<=n;++i){
if (!v[i]) v[i]=Si[i]=1ll*i*i+1,D[i]=Mc[i]=2,
prime[++Cnt]=i,Pp[Cnt]=v[i]-1;
for (rr int j=1,t=n/i;j<=Cnt&&prime[j]<=t;++j){
if (i%prime[j]==0){
Mc[i*prime[j]]=Mc[i]+1,
D[i*prime[j]]=D[i]/Mc[i]*Mc[i*prime[j]],
v[i*prime[j]]=v[i]*Pp[j]+1,
Si[i*prime[j]]=Si[i]/v[i]*v[i*prime[j]];
break;
}
Mc[i*prime[j]]=2,v[i*prime[j]]=Pp[j]+1,
D[i*prime[j]]=D[i]*D[prime[j]],
Si[i*prime[j]]=Si[i]*v[i*prime[j]];
}
}
}
signed main(){
rr int ans1=0,ans2=0,Test,Q,A,B,C;
scanf("%d%d%d%d%d",&Test,&Q,&A,&B,&C),Pro(C);
for (;Test;--Test,Q=(1ll*A*Q+B)%C+1)
ans1=mo(ans1,D[Q]+(Q&1)),
ans2=mo(ans2,(Si[Q]+4*(Q&1))%mod);
return !printf("%d\n%d",ans1,ans2);
}
#线性筛,斐波那契数列,GCD#BZOJ 2813 奇妙的Fibonacci的更多相关文章
- Python初学者笔记:打印出斐波那契数列的前10项
问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...
- 斐波那契数列 yield 和list 生成
def fab_demo4(max): a,n,b = 0,0,1 while n < max: yield b # 生成器走到这一步返回b,需要再次调用才能继续执行 a,b = b,a+b n ...
- Python学习笔记_斐波那契数列
""" 1.生成100项斐波那契数列 2.求第n项斐波那契数列的值是多少 3.给定终止值,生成此前斐波那契数列 """ # 求第n项斐波那契 ...
- 详解PHP如何实现斐波那契数列的简单实例
文章来自:有解网 http://www.youjieweb.com/original/index/articleId/64.html 使用场景: 面试 本文讲的是如何用php实现PHP实现斐波那契数列 ...
- 关于斐波拉契数列(Fibonacci)
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- 使用并行的方法计算斐波那契数列 (Fibonacci)
更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...
- 求斐波那契数列的第n项
问题描述:斐波那契数列是这样的一个数列,1,1,2,3,5,8,..,即前两项都是1,后面每一项都是其前面两项的和. 现在要你求出该数列的第n项. 分析:该问题是一个经典的数列问题,相信大家在很多语言 ...
- 斐波那契数列 的两种实现方式(Java)
import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...
随机推荐
- C++ STL学习
C++ STL学习 目录 C++ STL学习 容器库概览 对可以保存在容器中的元素的限制 容器支持的操作 所有容器都支持的操作或容器成员 迭代器 迭代器的公共操作 迭代器的类型 迭代器的const属性 ...
- BUUCTF [强网杯 2019]随便注 1
1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...
- 以二进制文件安装K8S之部署etcd高可用集群
概述 前提条件:已经准备好CA根证书(etcd在制作CA证书时需要CA根证书),并且把CA根证书文件ca.key和ca.crt拷贝到3个etcd节点的/etc/kubernetes/pki目录下. 3 ...
- 项目实战:Qt数据分析处理平台(兼容各国产麒麟系统)(文件域字符串解析,上万文件批量导入,折线图、散点图,正态分布图分析处理导出等)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/114710650长期持续带来更多项目与技术分享, ...
- Google Chrome 开启多下载下载,提高文件下载速度
在地址栏输入: chrome://flags/#enable-parallel-downloading Parallel downloading改为Enabled后重启浏览器即可打开多线程下载 (多线 ...
- Windows 实例如何开放端口
矩池云 Windows 实例相比于 Linux 实例,除了在租用机器的时候自定义端口外,还需要在 Windows防火墙中添加入口规则.接下来将教大家如何设置 Windows 防火墙,启用端口. 租用成 ...
- 【Azure Data Lake Storage】如何才能保留Blob中的文件目录结构(即使文件夹中文件数量为0的情况下)?
问题描述 在使用Azure Storage Account Blob时候,发现当文件夹中的Blob(文件)被全部输出后,文件夹也会消失? 为什么它不能像Windows系统中的文件夹一样,即使是一个空文 ...
- 【Azure Developer】使用Azure Resource Graph的查询语法的示例
文章"[Azure Developer]在Azure Resource Graph Explorer中查看当前订阅下的所有资源信息列表并导出(如VM的名称,IP地址内网/公网,OS,区域等) ...
- Linux安装Docker教程
介绍 Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers).可以在单一Linux实体下运 ...
- 影刀rpa:第二个项目学习心得
教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...