题目

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

\[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. centos7.x及centos8.x安装新版docker

    前置步骤 # 如之前安装过docker,请先删除 yum remove docker docker-common docker-selinux docker-engine centos7 # cent ...

  2. nodejs内存泄漏概要分析

    const heapdump = require('heapdump'); setTimeout( ()=>{ heapdump.writeSnapshot(`${process.cwd()}/ ...

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

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

  4. Java 如何自定义异常类

    1 package com.bytezero.throwable; 2 3 /** 4 * 5 * @Description 如何自定义异常类 6 * @author Bytezero·zhengle ...

  5. Java //使用scanner从键盘输入多种类型

    1 //1.引入包名 import java.util.Scanner 2 //2.新建Scanner对象 3 Scanner scan = new Scanner(system.in); 4 //3 ...

  6. XAF Blazor ListView 布局样式

    前言 XAFBlazor虽然可以适应PC端及移动端,但从它的界面可以看出,它明显是移动优先的(Mobile First).这样的界面在PC端有时会感觉不是很方便(特别对于数据密集的系统来说),即将发布 ...

  7. autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)

    autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...

  8. period 发音 per + iod 没有ri音 (per=round od=hod=way)

    period 发音 per + iod 没有ri音 pɪər iə d peri-在周围 + od-=hod-路,引申词义时期,阶段,句号等. per = round period 美: [ˈpɪrɪ ...

  9. 基于ads1299的可穿戴脑电信号采集之性能调试总结

    一 前言 问题背景: 最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试.   二 测试步骤 A 内部方波信号质量,通过测试发现内部方波信号质量特别好.这个说明了软件和存储这块,没啥 ...

  10. electron 中如何安装或更新 vuejs-devtool 最新稳定版

    手上正在开发的项目是vue3.0 通过添加 vue-cli-plugin-electron-builder 插件生成 electron 项目,项目在开发过程中发现 beta版的 vuejs-devto ...