题目

有一个斐波那契数列,满足

\[F_n=\begin{cases}1\qquad (n==1)\\1\qquad (n==2)\\F_{n-1}+F_{n-2}\qquad (n>2)\end{cases}
\]

多次询问给出一个\(n\)(\(n=(n'*A+B)\bmod C+1\)),问

\[\sum_{i=1}^n[F_i|F_n]以及\sum_{i=1}^n[F_i|F_n]i^2
\]

\(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\)

当然我还是证明一下吧

首先引理

\[F_{n+m}=F_{n-1}*F_m+F_n*F_{m+1}
\]

证明:

\[F_{n+1}=F_n+F_{n-1}
\]
\[F_{n+2}=F_n+F_{n+1}=2*F_n+F_{n-1}
\]
\[F_{n+3}=F_{n+2}+F_{n+1}=3*F_n+2*F_{n-1}
\]

以此类推,可以得证

有了这条,还有一个显然的引理就是\(\forall i\in N*,gcd(f_i,f_{i+1})=1\)

想要证明\(GCD\)不容易,一般都是通过更相减损法证明

\[gcd(F_{n+m},F_m)=gcd(F_n,F_m)
\]

那么

\[gcd(F_{n+m},F_m)=gcd(F_{n-1}*F_m+F_n*F_{m+1},F_m)=gcd(F_n*F_{m+1},F_m)=gcd(F_n,F_m)
\]

根据更相减损法和引理推出

那么显然可以通过这样的方法推出\(gcd(F_n,F_m)=F_{gcd(n,m)}\)

注意\(F_0=0\),不然就推不出来

证明写了这么长,那么可以得到答案其实就是

\[\sum_{i=1}^n[gcd(i,n)==i]以及\sum_{i=1}^n[gcd(i,n)==i]i^2
\]

一个是约数个数和,另一个是约数平方的和,分别维护。

先进行质因数分解得出\(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的更多相关文章

  1. Python初学者笔记:打印出斐波那契数列的前10项

    问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...

  2. 斐波那契数列 yield 和list 生成

    def fab_demo4(max): a,n,b = 0,0,1 while n < max: yield b # 生成器走到这一步返回b,需要再次调用才能继续执行 a,b = b,a+b n ...

  3. Python学习笔记_斐波那契数列

    """ 1.生成100项斐波那契数列 2.求第n项斐波那契数列的值是多少 3.给定终止值,生成此前斐波那契数列 """ # 求第n项斐波那契 ...

  4. 详解PHP如何实现斐波那契数列的简单实例

    文章来自:有解网 http://www.youjieweb.com/original/index/articleId/64.html 使用场景: 面试 本文讲的是如何用php实现PHP实现斐波那契数列 ...

  5. 关于斐波拉契数列(Fibonacci)

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...

  6. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  7. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  8. 使用并行的方法计算斐波那契数列 (Fibonacci)

    更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...

  9. 求斐波那契数列的第n项

    问题描述:斐波那契数列是这样的一个数列,1,1,2,3,5,8,..,即前两项都是1,后面每一项都是其前面两项的和. 现在要你求出该数列的第n项. 分析:该问题是一个经典的数列问题,相信大家在很多语言 ...

  10. 斐波那契数列 的两种实现方式(Java)

    import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...

随机推荐

  1. C++ STL学习

    C++ STL学习 目录 C++ STL学习 容器库概览 对可以保存在容器中的元素的限制 容器支持的操作 所有容器都支持的操作或容器成员 迭代器 迭代器的公共操作 迭代器的类型 迭代器的const属性 ...

  2. BUUCTF [强网杯 2019]随便注 1

    1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...

  3. 以二进制文件安装K8S之部署etcd高可用集群

    概述 前提条件:已经准备好CA根证书(etcd在制作CA证书时需要CA根证书),并且把CA根证书文件ca.key和ca.crt拷贝到3个etcd节点的/etc/kubernetes/pki目录下. 3 ...

  4. 项目实战:Qt数据分析处理平台(兼容各国产麒麟系统)(文件域字符串解析,上万文件批量导入,折线图、散点图,正态分布图分析处理导出等)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/114710650长期持续带来更多项目与技术分享, ...

  5. Google Chrome 开启多下载下载,提高文件下载速度

    在地址栏输入: chrome://flags/#enable-parallel-downloading Parallel downloading改为Enabled后重启浏览器即可打开多线程下载 (多线 ...

  6. Windows 实例如何开放端口

    矩池云 Windows 实例相比于 Linux 实例,除了在租用机器的时候自定义端口外,还需要在 Windows防火墙中添加入口规则.接下来将教大家如何设置 Windows 防火墙,启用端口. 租用成 ...

  7. 【Azure Data Lake Storage】如何才能保留Blob中的文件目录结构(即使文件夹中文件数量为0的情况下)?

    问题描述 在使用Azure Storage Account Blob时候,发现当文件夹中的Blob(文件)被全部输出后,文件夹也会消失? 为什么它不能像Windows系统中的文件夹一样,即使是一个空文 ...

  8. 【Azure Developer】使用Azure Resource Graph的查询语法的示例

    文章"[Azure Developer]在Azure Resource Graph Explorer中查看当前订阅下的所有资源信息列表并导出(如VM的名称,IP地址内网/公网,OS,区域等) ...

  9. Linux安装Docker教程

    介绍 Docker利用Linux核心中的资源分脱机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers).可以在单一Linux实体下运 ...

  10. 影刀rpa:第二个项目学习心得

    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...